socket 编程入门教程(一)TCP server 端:7、接收与发送

现在,我们通过accept()创建了新的socket,也就是我们类中的数据成员communicationSock,现在,我们就可以通过这个socket进行通讯了。

TCP通讯模型

        在介绍函数之前,我们应该了解一些事实。TCP的Server/Client模型类似这样:
ServApp——ServSock——Internet——ClntSock——ClntApp
当然,我们这里的socket指的就是用于“通讯”的socket。TCP的server端至少有两个socket,一个用于监听,一个用于通讯;TCP的server端可以只有一个socket,这个socket同时“插”在server的两个socket上。当然,插上listen socket的目的只是为了创建communication socket,创建完备后,listen是可以关闭的。但是,如果这样,其他的client就无法再连接上server了。
        我们这个模型,是client的socket插在server的communication socket上的示意。这两个socket,都拥有完整的本地地址信息以及远程计算机地址信息,所以,这两个socket以及之间的网络实际上形成了一条形式上“封闭”的管道。数据包只要从一端进来,就能知道出去的目的地,反之亦然。这正是TCP协议,数据流形式抽象化以及实现。因为不再需要指明“出处”和“去向”,对这样的socket(实际上是S/C上的socket对)的操作,就如同对本地文件描述符的操作一样。但是,尽管我们可以使用read()和write(),但是,为了完美的控制,我们最好使用recv()和send()。

recv()和send()
int send(int socket, const void* msg, unsigned int msgLength, int flags);
int recv(int socket, void* rcvBuffer, unsigned int bufferLength, int flags);
在Linux中的实现为:
#include <sys/socket.h>

/* Send N bytes of BUF to socket FD.  Returns the number sent or -1.

   This function is a cancellation point and therefore not marked with
   __THROW.  
*/
extern ssize_t send (int __fd, __const void *__buf, size_t __n, int __flags);

/* Read N bytes into BUF from socket FD.
   Returns the number read or -1 for errors.

   This function is a cancellation point and therefore not marked with
   __THROW.  
*/
extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
这两个函数的第一个参数是用于“通讯”的socket,第二个参数是发送或者接收数据的起始点指针,第三个参数是数据长度,第四个参数是控制符号(默认属性设置为0就可以了)。失败时候传回-1,否则传回实际发送或者接收数据的大小,返回0往往意味着连接断开了。

处理echo行为
void TcpServer::handleEcho()
{
    
const int BUFFERSIZE = 32;
    
char buffer[BUFFERSIZE];
    
int recvMsgSize;
    
bool goon = true;

    
while ( goon == true ) {
        
if ( (recvMsgSize = recv(communicationSock, buffer, BUFFERSIZE, 0)) < 0 ) {
            
throw "recv() failed";
        } 
else if ( recvMsgSize == 0 ) {
            goon 
= false;
        } 
else {
            
if ( send(communicationSock, buffer, recvMsgSize, 0!= recvMsgSize ) {
                
throw "send() failed";
            }
        }
    }

    close(communicationSock);
}
本小节最后要讲的函数是close(),它包含在<unistd.h>中
#include <unistd.h>

/* Close the file descriptor FD.

   This function is a cancellation point and therefore not marked with
   __THROW.  
*/
extern int close (int __fd);
这个函数用于关闭一个文件描述符,自然,也就可以用于关闭socket。
下一小节是完整的源代码。默认的监听端口是5000。我们可以通过
$telnet 127.0.0.1 5000
验证在本机运行的echo server程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用ROC找阈值点cutpoint

def Find_Optimal_Cutoff(TPR, FPR, threshold):y TPR - FPRYouden_index np.argmax(y)#阈值optimal_threshold threshold[Youden_index]#阈值对应的点point [FPR[Youden_index], TPR[Youden_index]]return optimal_threshold, pointtest_fpr, test_tpr, test_thresholds …

json中怎么去掉[]外的引号_如何正确检查发动机中的机油量?从机油尺处向外窜气是怎么回事?...

机油是发动机的血液&#xff0c;发动机中必须有足够多的机油&#xff0c;才能完成润滑、冷却等任务。为了让驾驶员随时能够查看到发动机中机油的存量&#xff0c;在发动机上都设置了一个机油尺&#xff0c;我们只要把它拔出来&#xff0c;就可以查看机油的液位了&#xff1b;而…

flex常见问题归纳

flex警告&#xff1a;swc“D:\Adobe\Adobe Flash Builder 4.5\sdks\4.5.1\frameworks\libs\framework.swc”具有默认样式并且在 library-path 中&#xff0c;表示依赖项将不带有样式进行链接。这可能会导致使用输出 swc 的应用程序出现外观丢失的现象。swc 应该放置在 external…

arcgis符号系统的分类方法介绍

使用标准分类方案 类范围和间隔的定义方式可确定属于各个类的数据的量以及地图的外观。分类方案包括两个主要部分&#xff1a;组织数据所参照的类数目以及指定类时所依据的方法。类数目取决于您的分析目的。然而&#xff0c;需要对为类分配数据时所依据的规则进行简要说明。对…

k8s往secret里导入证书_k8s中secret解析

概览Secret是用来保存小片敏感数据的k8s资源&#xff0c;例如密码&#xff0c;token&#xff0c;或者秘钥。这类数据当然也可以存放在Pod或者镜像中&#xff0c;但是放在Secret中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。用户可以创建自己的secret&#x…

HDU1856_More is better

题目大意&#xff1a; 让你输入n,然后输入n组数据&#xff0c;表示a与b的关系&#xff0c;最后求出关系最多一组的个数。注意&#xff08;a与b有关系&#xff0c;b与c有关系&#xff0c;那么a与c就有关系&#xff09; 解题思路&#xff1a; 并查集&#xff0c;…

html爱心代码

此处填写你爱人的名字 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!doctype html> <html> <head><meta charset&qu…

Linux TCP server系列(4)-浅谈listen与大并发TCP连接

背景&#xff1a; 服务器在调用listen和accept后&#xff0c;就会阻塞在accept函数上&#xff0c;accpet函数返回后循环调用accept函数等待客户的TCP连接。如果这时候又大量的用户并发发起connect连接&#xff0c;那么在listen有队列上限(最大可接受TCP的连接数)的情况下&#…

领航机器人广告段子_医院机器人物流广告词_段子网收录最新段子

瑞典RJO医疗供应商&#xff0c;机器人自助式物流领航者&#xff0c;拥有自己的机器人工作组&#xff0c;让医院处处散发出高科技。使用机器人物流体系&#xff0c;医院内部运输物料在标准化、可控、准时、高效方面有质的改变&#xff0c;大大提高医院对外形象。特征集广告词&am…

分享制作精良的知识管理系统 配置SQL Server文档数据库 完美实现博客文章的的下载,存储和浏览...

前一篇文章《分享制作精良的知识管理系统 博客备份程序 Site Rebuild》已经提到如何使用Site Rebuild来下载您所喜欢的博客文章&#xff0c;但是还不能实现把下载的文件导入进数据库中&#xff0c;无法实现在线浏览服务器中的文档数据。这一篇文章则帮助您建立文档数据库&#…

python绘制敏感性和特异性曲线(交叉)

示例 代码如下 test_fpr, test_tpr, test_thresholds roc_curve(y_test_two, dataset_blend_test_pred, pos_label1) test_roc_auc auc(test_fpr, test_tpr) plt.plot(test_thresholds, 1-test_fpr, labelspecificity) plt.plot(test_thresholds, test_tpr, labelsensitivit…

python迭代器创建序列_Python 中迭代器与生成器实例详解

Python 中迭代器与生成器实例详解本文通过针对不同应用场景及其解决方案的方式&#xff0c;总结了Python中迭代器与生成器的一些相关知识&#xff0c;具体如下&#xff1a;1.手动遍历迭代器应用场景&#xff1a;想遍历一个可迭代对象中的所有元素&#xff0c;但是不想用for循环…

一个网络资深者发起的思考

陈硕 (giantchen AT gmail) blog.csdn.net/Solstice 前几天我在新浪微博上出了两道有关 TCP 的思考题&#xff0c;引发了一场讨论 http://weibo.com/1701018393/eCuxDrta0Nn 。 第一道初级题目是&#xff1a; 有一台机器&#xff0c;它有一个 IP&#xff0c;上面运行了一个 TCP…

The Ransom of Red Chief

We can kidnap someone here. Who? Theres nobody rich in this town. The richest man in town, of course. Kidnap      绑架 rich         富 trouble      麻烦 Im not having a nice day. How much money have we got? Only two hundred dollars. Ra…

C++课堂整理--第一章内容

提前声明&#xff1a; 本文内容为华北水利水电大学研究生C课程&#xff0c;如有 侵权请告知&#xff0c;作者会予以删除 1.C特点 1.历史悠久。2.应用广泛。3.兼容c。4.面向对象。5.适合编写系统程序。6.有助于理解计算机的工作过程&#xff0c;深入理解计算机的原理和概念 …

oauth2 access_denied 不允许访问_OAuth 2 是什么-入门介绍

OAuth 2是什么OAuth 2是一个可以通过浏览器&#xff0c;手机等多种设备进行安全授权的一个标准简单的开源协议。随着互联网的兴起以及普及&#xff0c;越来越多的应用出现在用户的面前。这些应用大部分都是相对独立的以及由不同的公司进行运营的。不同的应用也保存了不同的数据…

基于TCP协议的网络程序(基础学习)

下图是基于TCP协议的客户端/服务器程序的一般流程&#xff1a; 图 37.2. TCP协议通讯流程 服务器调用socket()、bind()、listen()完成初始化后&#xff0c;调用accept()阻塞等待&#xff0c;处于监听端口的状态&#xff0c;客户端调用socket()初始化后&#xff0c;调用connect(…

云谊网-赴日人才社交网络

云谊网是为已赴日和准备赴日从事IT工作的人才提供经验交流的的社交网络平台&#xff0c;在这里您可以拓展人脉、发现机遇、推荐职位、分享知识。网址&#xff1a;http://club.sinowell.net/ 全国各IT领军城市软件和服务外包QQ群(ITO、BPO、HRO) 群描述&#xff1a;IT公司之间的…

一段代码认识C++中const不同位置的用处

#include<iostream> using namespace std ; int main () { const int A 78 ;const int B 25 ;int C 13 ;//---------const在数据类型前-------------------- const int *pi &A ;//*pi 56 ;// 错误, 不能修改所指常量。此时*pi指向的是常量A。 pi &…

怎么形容智能冰激凌机器人_有关于形容描写冰激凌的句子及图片

1、我拿出冰淇淋&#xff0c;隐隐约约的看见淡黄的雪梨果肉和黑乎乎的巧克力豆。嗯&#xff0c;牛奶的香醇中又夹杂着雪梨的清甜和巧克力的浓香&#xff0c;味道好极了。2、冰淇淋上面有各种各样颜色&#xff0c;有红的、黄的、紫的……真像一个八宝饭。3、冰淇淋的形状看上去像…