By fireworks2@foxmail.com
从网上摘抄,根据自己的理解整理的
int send( SOCKET s, const char FAR *buf, int len, int flags );
1 参数 len 大于s的发送缓冲长度(可由setsockopt设置), 返回SOCKET_ERROR;
2 参数 len 小于等于缓冲区长度,发送完正在发送的数据,并查看缓冲区剩余空间大小left
a. len > left,等待协议栈发送数据至 len <= left,后同"b"
b. len <= left,将数据拷贝至套接字的缓冲区,返回实际拷贝的字节数
上述两步中出错都会返回 SOCKET_ERROR
int recv( SOCKET s, char FAR *buf, int len, int flags);
1. recv 先等待s的发送缓冲中的数据被协议传送完毕,出错返回SOCKET_ERROR
2. recv 阻塞到协议把数据接收完毕
3. 把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于len)
如果使用非阻塞调用,则上述过程中的等待将不存在,而是立即返回相应的状态
要注意send和recv的返回值,可用perror输出错误信息
sendto recvfrom 类似,用于udp
NOTE:
1. recv()返回的大小如果等于 len,那么可能是还有数据未读完;在UDP的情况下,如果 len 小于包长,会产生未定义的行为(依赖于不同的实现)
2. 在Unix系统下,如果send/recv在等待协议传送/接收数据时网络断开的话,调用的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止
阅读(2467) | 评论(0) | 转发(0) |