‘壹’ Socket send函数和recv函数详解
send函数
在Socket编程中,send函数用于向TCP连接另一端发送数据。无论客户端或服务器应用程序,均能使用此函数。客户端通常用send向服务器发送请求,而服务器则用它回应客户端。该函数接受套接字描述符、发送数据缓冲区、数据字节数及标志参数作为输入。函数比较要发送的数据长度与套接字的发送缓冲区大小。若大于,则返回SOCKET_ERROR。若小于或等于,则检查协议是否正在发送数据或套接字缓冲区是否有数据。若协议未开始发送或无数据,则比较剩余空间与数据长度。若大于,则等待协议发送数据;若小于,则将数据复制到剩余空间。成功复制后,返回实际复制的字节数。出现错误时,返回SOCKET_ERROR。若在等待协议发送数据时网络中断,也返回SOCKET_ERROR。在Unix系统下,进程会收到SIGPIPE信号,处理终止。对于异步Socket的send函数,在网络刚断开时仍能发送,并返回相应字节数,select检测也是可写的,但稍后再次发送会出错。select检测无法检测出可写状态。
recv函数
recv函数用于从TCP连接另一端接收数据。客户端和服务器应用程序都可使用此函数。函数接收套接字描述符、接收数据缓冲区、数据长度及标志参数。执行流程如下:等待s的发送缓冲中的数据被协议完全传输。若在传输中出现网络错误,返回SOCKET_ERROR。若发送缓冲无数据或数据传输完毕,检查套接字接收缓冲区。若无数据或协议正在接收数据,则等待协议接收完毕。将s接收缓冲中的数据复制到buf中,返回实际复制的字节数。复制时出现错误,返回SOCKET_ERROR。若在等待协议接收数据时网络中断,返回0。在Unix系统下,进程会收到SIGPIPE信号,处理终止。
‘贰’ 在socket编程中怎么判断recv是否接收完成
recv函数怎么判断接收结束:
1、例如在数据流中带个结束标识,那样读到结束标识就知道传输完成,停止。 这种方法只能用传输文本文件,有个文件结束符,二进制文件不行。
2、先传个长度,那么接收方就可以控制 接下来要读取多少个字节的数据才算完成。这个适合传输任何文件。
例子:
C/C++ code
client的发函数为:char line[MAXLINE]; while ((fgets(line,MAXLINE,fd)!=NULL) // fd 为一个文件的指针 {send (connfd, line,strlen(line),0) // connfd为 socket}server 的接收函数为:for (;;) {if ((n=recv(connfd, recvline,MAXLINE,0)>0) {recvline[n]=0;fputs(stdout,recvline);else break;}}
当发端停止发送后,收端无法得知数据已经传输完毕,从而一直在for中死循环,可以用以上方法判断接收结束。