文档详情

linux内核中send与recv函数详解.pdf

发布:2017-09-14约5.05千字共4页下载文档
文本预览下载声明
为为梦梦起起航航 不不积积小小流流无无以以成成江江海海 lliinnuuxx内内核核中中sseenndd与与rreeccvv函函数数 解解 分类: linux网络编程 2013-12-16 11:14 22人阅读 评论 (0) 收藏 举报 sendrecvlinux网络编程 Linux send与recv 函数 解 1.简简介介 [plain] view plaincopyprint? 1. #include sys/socket .h 2. ssize_t recv(int sockfd, void *buff, size_t nbytes, int fla s); 3. ssize_t send(int sockfd, const void *buff, size_t nbytes, int fla s); send和recv 的前3个参数等同于read和write; flags参数值为0或: flags 说明 recv send MSG_ DONTROUTE 绕过路由表查找 MSG_ DONTWA IT 仅本操作非阻塞 • MSG_OOB 发送或接收带外数据 MSG_ PEEK 窥看外来消息 MSG_WA ITA LL 等待所有数据 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 中的 1 冲区中的数据传到连接的另一端的,而是协议传送的。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信号,进程对该信号的处理是进程终止。
显示全部
相似文档