linux下网络收发包之 send recv
时间:2010-12-21 来源:fireworks2
从网上摘抄,根据自己的理解整理的
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,那么可能是还有数据未读完
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,那么可能是还有数据未读完
2. 在Unix系统下,如果send/recv在等待协议传送/接收数据时网络断开的话,调用的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止
相关阅读 更多 +