Chinaunix首页 | 论坛 | 博客
  • 博客访问: 224874
  • 博文数量: 27
  • 博客积分: 1151
  • 博客等级: 少尉
  • 技术积分: 426
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-15 19:25
文章分类
文章存档

2012年(5)

2011年(6)

2010年(16)

我的朋友

分类: LINUX

2010-12-21 21:25:20

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的接收缓冲中的数据copybuf中(注意协议接收到的数据可能大于len

如果使用非阻塞调用,则上述过程中的等待将不存在,而是立即返回相应的状态
要注意send和recv的返回值,可用perror输出错误信息
sendto recvfrom 类似,用于udp

NOTE:
1. recv()返回的大小如果等于 len,那么可能是还有数据未读完;在UDP的情况下,如果 len 小于包长,会产生未定义的行为(依赖于不同的实现)

2. 在Unix系统下,如果send/recv在等待协议传送/接收数据时网络断开的话,调用的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止

阅读(2460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~