函数原型
read/write系原型
 #include <unistd.h>

 ssize_t read(int fd, void *buf, size_t count);
 #include <unistd.h>

 ssize_t write(int fd, const void *buf, size_t count);
 #include <sys/uio.h>

 ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

 ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
send/recv系原型
 #include <sys/types.h>
#include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen); ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
 #include <sys/types.h>
#include <sys/socket.h> ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen); ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
详细说明
write/read

write用于向任意文件描述符中写入(读取)数据,用作socket发送数据时,只能向已经建立连接的文件描述符中写入(读取)数据;参数以及返回值如下:

 /**
* @fd 文件描述符
* @buf 待写入数据缓冲区
* @count 请求写入字节数
* 成功返回写入字节数,失败返回-1
*/
ssize_t write(int fd, const void *buf, size_t count);
 /**
* @fd 文件描述符
* @buf 读出数据缓冲区
* @count 请求读出字节数
* 成功返回读取的字节数,0表示读到文件尾,失败返回-1
*/
ssize_t read(int fd, void *buf, size_t count);
writev/readv

writev向任意文件描述符中写入多个缓冲区的数据,readv用于从任意描述符中向多个缓冲区读取数据,用作socket发送数据时,只能向已经建立连接的文件描述符中写入(读取)数据;参数以及返回值如下:

 /**
* @fd 文件描述符
* @iov 多个缓冲区向量
* @iovcnt 缓冲区数量
* 成功返回写入字节数 失败返回-1
*/
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
 /**
* @fd 文件描述符
* @iov 多个缓冲区向量
* @iovcnt 缓冲区数量
* 成功返回读出字节数 失败返回-1
*/
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
writev/readv补充说明

writev/readv与write/read功能基本一致,区别在于writev/readv可以写入或者读出指向多个缓冲区;其向量参数iov由多个下面的结构组成,每个结构指向一个缓冲区;

 struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
};
send/recv

send用于向socket中写入(读取)数据,只能用于已经建立连接的socket上,udp也可以调用connect建立连接;

 /**
* @sockfd socket文件描述符
* @buf 待发送数据缓冲区
* @len 请求发送数据字节数
* @flags 标志位
* 成功返回发送字节数 失败返回-1
*/
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
 /**
* @sockfd socket文件描述符
* @buf 请求接收数据的数据缓冲区
* @len 请求接收的字节数
* @flags 标志位
* 成功返回读取的字节数 失败返回-1
*/
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
send/recv补充说明

send/recv与write/read的作用基本相同,只是多了一个flag参数,当flag参数设置为0时,它们的功能一致;当sendto/recvfrom函数地址指针为NULL且地址长度为0时,其作用于send/recv一致,实际上内核实现send/recv也是对sendto/recvfrom做了忽略地址信息的简单封装;

sendto/recvfrom

sendto用于向socket中写入(读取)数据,如果用在已经建立连接的socket上,需要忽略其地址和地址长度参数,即地址指针设置为NULL,地址长度设置为0;如udp,如果不调用connec建立连接,则需要指定地址参数,如果调用connect建立了连接,则省略地址参数;

 /**
* @sockfd socket文件描述符
* @buf 待写入数据缓冲区
* @len 请求写入数据长度
* @flags 标志位
* @dest_addr 目的地址
* @addrlen 地址长度
* 成功返回发送字节数 失败返回-1
*/
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
 /**
* @sockfd socket文件描述符
* @buf 读取数据的缓冲区
* @len 请求读取数据长度
* @flags 标志位
* @src_addr 源地址
* @addrlen 地址长度
* 成功返回读取字节数 失败返回-1
*/
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
sendto/recvfrom补充说明

当sendto/recvfrom函数地址指针为NULL且地址长度为0时,其作用于send/recv一致,实际上内核实现send/recv也是对sendto/recvfrom做了忽略地址信息的简单封装;

sendmsg/readmsg

sendmsg用于向socket文件描述符中写入多个缓冲区的数据,recvmsg用于向多个缓冲区读取socket文件描述符中的数据,发送(接收)前需要构造msghdr消息头;参数以及返回值如下:

 /**
* @sockfd socket文件描述符
* @msg 消息
* @标志位
*/
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
 /**
* @sockfd socket文件描述符
* @msg 消息
* @标志位
*/
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
sendmsg/recvmsg补充说明

sendmsg/recvmsg需要构造的消息头部如下,其中msg_iov指向多个iovec,没给iovec对应着一个缓冲区,msg_iovlen标识缓冲区的数量;

 struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
 struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
};
函数对比

图片来自<unix网络编程>

套接字I/O函数write/read writev/readv send/recv sendto/recvfrom sendmsg/recvmsg的更多相关文章

  1. 基本SCTP套接字编程常用函数

    sctp_bindx函数:允许SCTP套接字捆绑一个特定地址子集 #include <netinet/sctp.h> // 若成功返回0,出错返回-1 int sctp_bindx(int ...

  2. Linux内核分析:recv、recvfrom、recvmsg函数实现

    先看一下这三个函数的声明: #include <sys/types.h> #include <sys/socket.h> ssize_t recv(int sockfd, vo ...

  3. UNIX网络编程——非阻塞式I/O(套接字)

    套接字的默认状态是阻塞的.这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待相应的操作完成.可能阻塞的套接字调用可分为以下4类: (1)输入操作,包括read,readv,rec ...

  4. python UDP套接字通信

    UDPserver.py import socket #导入套接字模块 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # - socket.A ...

  5. ZeroMQ接口函数之 :zmq_socket – 创建ZMQ套接字

    ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ZeroMQ 官方地址:http://api.zeromq.org/4 ...

  6. 【UNIX网络编程(二)】基本TCP套接字编程函数

    基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...

  7. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...

  8. Linux进程间通信(九):数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

    前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套 ...

  9. 孙鑫MFC学习笔记16:异步套接字

    16 1.事件对象 2.CreateEvent创建事件对象 3.SetEvent设置事件对象为通知状态 4.ResetEvent设置事件对象为非通知状态 5.InitializeCriticalSec ...

随机推荐

  1. python发起post请求获取json数据使用requests方法

    最普通的答案 我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的 . 可能很多人都已经猜到了答案是: 1.GET 使用URL或Cookie传参.而POS ...

  2. 解决 webpack 打包文件体积过大

    webpack 把我们所有的文件都打包成一个 JS 文件,这样即使你是小项目,打包后的文件也会非常大.下面就来讲下如何从多个方面进行优化. 去除不必要的插件 刚开始用 webpack 的时候,开发环境 ...

  3. 新技能get,文件夹隐藏

    attrib命令用来显示或更改文件属性. ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S ...

  4. 访问接口错误,com.netflix.client.ClientException: Load balancer does not have available server for client: panfeng-item-service

    com.netflix.client.ClientException: Load balancer does not have available server for client: panfeng ...

  5. Spring Boot热部署插件

    在实际开发中,我们修改某些代码逻辑功能或页面都需要重启应用,这无形中降低了开发效率,热部署是指当我们修改代码后,服务能自动重启加载新修改的内容,而不需要重启应用,这样大大提高了我们开发的效率. Spr ...

  6. const与constexpr

    关于const型数据,谭浩强老爷子这么总结道: Time const t; //t是常对象,其值在任何情况下都不能改变 void Time::fun()const; //fun是Time类中的常成员函 ...

  7. vps 11步移站步骤笔记

    移站是经常的事,现在把步骤写上,防止忘记命令 1.登录SSH 2.打包数据库,phpmyadmin中备份数据库,导入新数据库,数据库中域名链接进行相应替换 获取phpmyadmin root密码 ca ...

  8. windows下双击可运行的Java软件打包方案(转)

    出处: http://www.cnblogs.com/shiyangxt/ 刚开始学Java的时候,挺郁闷的,写出来的java类文件,需要dos下编译,然后再dos下运行看效果.这使初学者常常 觉得麻 ...

  9. ab测试nginx Nginx性能优化

    转自:https://www.cnblogs.com/nulige/p/9369700.html 1.性能优化概述 在做性能优化前, 我们需要对如下进行考虑 1.当前系统结构瓶颈 观察指标 压力测试 ...

  10. BZOJ1079 [SCOI2008]着色方案[组合计数DP]

    $有a_{1}个1,a_{2}个2,...,a_{n}个n(n<=15,a_{n}<=5),求排成一列相邻位不相同的方案数.$ 关于这题的教训记录: 学会对于复杂的影响分开计,善于发现整体 ...