1.简介
print?
- #include
- ssize_trecv(intsockfd,void*buff,size_tnbytes,intflags);
- ssize_tsend(intsockfd,constvoid*buff,size_tnbytes,intflags);
- send和recv的前3个参数等同于read和write;
- flags参数值为0或:
flags | 阐明 | recv | send |
MSG_DONTROUTE | 绕过路由表查找 | • | |
MSG_DONTWAIT | 仅本操作非堵塞 | • | • |
MSG_OOB | 发送或接纳带外数据 | • | • |
MSG_PEEK | 窥看外来音讯 | • | |
MSG_WAITALL | 等候一切数据 | • |
2. send解析
- sockfd:指定发送端套接字描述符。
- buff: 寄存要发送数据的缓冲区
- nbytes: 实践要改进的数据的字节数
- flags: 一般设置为0
1) send先比较发送数据的长度nbytes和套接字sockfd的发送缓冲区的长度,假如nbytes > 套接字sockfd的发送缓冲区的长度, 该函数回来SOCKET_ERROR。
2) 假如nbtyes <= 套接字sockfd的发送缓冲区的长度,那么send先查看协议是否正在发送sockfd的发送缓冲区中的数据,假如是就等候协议把数据发送完,假如协议还没有开端发送sockfd的发送缓冲区中的数据或许sockfd的发送缓冲区中没有数据,那么send就比较sockfd的发送缓冲区的剩下空间和nbytes。
3) 假如 nbytes > 套接字sockfd的发送缓冲区剩下空间的长度,send就一同等候协议把套接字sockfd的发送缓冲区中的数据发送完。
4) 假如 nbytes < 套接字sockfd的发送缓冲区剩下空间巨细,send就仅仅把buf中的数据copy到剩下空间里(留意:并不是send把套接字sockfd的发送缓冲区中的数据传到衔接的另一端的,而是协议传送的。send仅仅是把buf中的数据copy到套接字sockfd的发送缓冲区的剩下空间里)。
5) 假如send函数copy成功,就回来实践copy的字节数,假如send在copy数据时呈现过错,那么send就回来SOCKET_ERROR;假如在等候协议传送数据时网络断开,send函数也回来SOCKET_ERROR。
6) send函数把buff中的数据成功copy到sockfd的发送缓冲区的剩下空间后它就回来了,可是此刻这些数据并不一定立刻被传到衔接的另一端。假如协议在后续的传送过程中呈现网络过错的话,那么下一个socket函数就会回来SOCKET_ERROR(每一个除send的socket函数在履行的最开端总要先等候套接字的发送缓冲区中的数据被协议传递结束才干持续,假如在等候时呈现网络过错那么该socket函数就回来SOCKET_ERROR)。
7) 在unix体系下,假如send在等候协议传送数据时网络断开,调用send的进程会接纳到一个SIGPIPE信号,进程对该信号的处理是进程停止。
2.recv解析
- sockfd: 接纳端套接字描述符
- buff: 用来寄存recv函数接纳到的数据的缓冲区
- nbytes: 指明buff的长度
- flags: 一般置为0
1) recv先等候sockfd的发送缓冲区的数据被协议传送结束,假如协议在传送sock的发送缓冲区中的数据时呈现网络过错,那么recv函数回来SOCKET_ERROR。
2) 假如套接字sockfd的发送缓冲区中没有数据或许数据被协议成功发送结束后,recv先查看套接字sockfd的接纳缓冲区,假如sockfd的接纳缓冲区中没有数据或许协议正在接纳数据,那么recv就一同等候,直到把数据接纳结束。当协议把数据接纳结束,recv函数就把sockfd的接纳缓冲区中的数据copy到buff中(留意:协议接纳到的数据或许大于buff的长度,所以在这种情况下要调用几回recv函数才干把sockfd的接纳缓冲区中的数据copy完。recv函数仅仅是copy数据,真实的接纳数据是协议来完结的)。
3) recv函数回来其实践copy的字节数,假如recv在copy时犯错,那么它回来SOCKET_ERROR。假如recv函数在等候协议接纳数据时网络中断了,那么它回来0。
4) 在unix体系下,假如recv函数在等候协议接纳数据时网络断开了,那么调用 recv的进程会接纳到一个SIGPIPE信号,进程对该信号的默许处理是进程停止。