int send( SOCKET s, const char FAR *buf, int len, int flags );
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。
客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。
该函数的第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程序要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字节数;
第四个参数一般置0。
这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度, 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议 是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余 空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。
要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如 果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR)
注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。
recv函数
int recv( SOCKET s, char FAR *buf, int len, int flags );
不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。
该函数的第一个参数指定接收端套接字描述符;
第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
第三个参数指明buf的长度;
第四个参数一般置0。
这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数 据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。 cp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调用recv);socklen_t sendbuflen = 0; socklen_t len = sizeof(sendbuflen); getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len); printf("default,sendbuf:%d\n", sendbuflen); sendbuflen = 10240; setsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, len); getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len); printf("now,sendbuf:%d\n", sendbuflen);需要注意的是,虽然将发送缓存设置成了10k,但实际上,协议栈会将其扩大1倍,设为20k.
以上就是小编为大家带来的对send(),recv()函数的全面理解全部内容了,希望大家多多支持小牛知识库~
本文向大家介绍请你讲述一下Socket编程的send() recv() accept() socket()函数?相关面试题,主要包含被问及请你讲述一下Socket编程的send() recv() accept() socket()函数?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: send函数用来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用s
我最后几天都在和epoll做斗争,现在我在一个不知道的地方;) 网络上有很多信息,很明显在系统里,伙计,但我可能服用过量,有点困惑。 在我的服务器应用程序(到nginx的后端)中,我正在以ET模式等待来自客户端的数据: 据我所知,send()还可能返回-1和EAGAIN,这意味着我应该在EPOLLOUT上订阅,并等待内核缓冲区空闲到可以从我的ME接收一些数据时。这样对吗?但如果客户不等那么久呢?或
我的环境:windows10和python 3.6 目的:我想建立一个在线聊天室,当客户端连接到服务器上,并向服务器发送消息时,服务器将向所有与它有联系的客户端广播消息。 关键点:所以有一个问题,我想让客户机监听服务器,同时等待输入。(代码发布在下面) 我的解决方案:当我试图通过python的线程来解决这个问题时,结果是,假设客户机A和客户机B都连接到服务器,并且客户机A发送多条消息,而客户机B只
例如,我有: 有没有办法将和导出为全局函数,这样我就可以直接调用,而不是? 我的上下文是使用Rhino/Nashorn脚本引擎,我想注入一个提供全局函数的“全局”对象。
描述 (Description) 此函数在SOCKET上接收尝试读取LENGTH字节的消息,将读取的数据放入变量SCALAR.FLAGS参数采用与函数所基于的recvfrom()系统函数相同的值。 与套接字通信时,这提供了一种比sysread函数或基于行的运算符更可靠的读取固定长度数据的方法。 语法 (Syntax) 以下是此函数的简单语法 - recv SOCKET, SCALAR, LEN,
recv(经socket接收数据) 相关函数 recvfrom,recvmsg,send,sendto,socket 表头文件 #include<sys/types.h> #include<sys/socket.h> 定义函数 int recv(int s,void *buf,int len,unsigned int flags); 函数说明 recv()用来接收远端主机经指定的socket传来的