Linux send与recv函数详解
1.简介
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
-
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信号,进程对该信号的默认处理是进程终止。
分享到:
相关推荐
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。
recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。 如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。 假如套接字上没有消息可以读取,...
send 和recv 详解,绝对好东西。
里面有socket函数和recv函数的详细讲解,有用
send recv nit linux 下recv send
HOOK SEND RECV函数拦截网络封包的程序
这是一份关于 socket_recv的文档,相信对想学习 socket_recv的同学一定有很大的帮助!
关于recv函数在不知道接收数据大小时如何申请buffer
hook send recv wsasend wsarecv 封包工具源码 本工具支持命令行操作,采用远程线程注入目标进程,注入后hook发包函数,实现封包拦截。 主程序为MFC编写 动态链接库VC WIN32项目
客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。 该函数的第一个参数指定发送端套接字描述符; 第二个参数指明一个存放应用程序要发送数据的缓冲区; 第三个参数指明实际...
serial_send_recv.c
本文主要介绍了python网络编程调用recv函数完整接收数据的三种方法。具有很好的参考价值,下面跟着小编一起来看下吧
udp 测试程序 udp 测试程序 udp 测试程序 udp 测试程序
Socket下send和recv使用的说明及介绍
封包助手是一个能拦截网络应用程序数据包的纯绿色软件(压缩包不足400KB,无插件无病毒,不需安装),包括Send,Recv,WSASend,WSARecv,SendTo,RecvFrom,WSASendTo,WSARecvFrom。 封包助手还可以拦截Connect和Accept...
国外著名反辅Zhu软件 BE R3调用内核函数通讯驱动方法与此源码方法一样 在这之前网上不会找出第二份内核发包的源码 懂的人自然会懂 一直以来防破J技术在网上并没有什么新的共享探讨 因为大神们不喜欢开源 此方法非常...
python数据分析与可视化-02-socket之send和recv的原理剖析.ev4.rar
udp recv程序,非阻塞方式。使用了udp接收ts码流,供初学者迅速掌握。并上传了makefile文件,简单修改程序可以实现简单的功能,在linux下已经测试了
linux中netstatus查看SYN_RECV.docx
UDP运输层协议,本代码将实现udp服务器端接受数据,udp客户端接收数据