linux下网络收发包之 send recv

从网上摘抄,根据自己的理解整理的

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信号,进程对该信号的默认处理是进程终止

作者: fireworks2   发布时间: 2010-12-21