套接字I/O函数write/read writev/readv send/recv sendto/recvfrom sendmsg/recvmsg

函数原型
read/write系原型
1 #include <unistd.h>
2
3 ssize_t read(int fd, void *buf, size_t count);
1 #include <unistd.h>
2
3 ssize_t write(int fd, const void *buf, size_t count);
1 #include <sys/uio.h>
2
3 ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
4
5 ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
send/recv系原型
1 #include <sys/types.h>
2 #include <sys/socket.h>
3
4 ssize_t send(int sockfd, const void *buf, size_t len, int flags);
5
6 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
7                       const struct sockaddr *dest_addr, socklen_t addrlen);
8
9 ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
1 #include <sys/types.h>
2 #include <sys/socket.h>
3
4 ssize_t recv(int sockfd, void *buf, size_t len, int flags);
5
6 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
7                         struct sockaddr *src_addr, socklen_t *addrlen);
8
9 ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
详细说明
write/read

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

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

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

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

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

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

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

1 /**
2  * @sockfd socket文件描述符
3  * @buf 待发送数据缓冲区
4  * @len 请求发送数据字节数
5  * @flags 标志位
6  * 成功返回发送字节数 失败返回-1
7  */
8 ssize_t send(int sockfd, const void *buf, size_t len, int flags);
1 /**
2  * @sockfd socket文件描述符
3  * @buf 请求接收数据的数据缓冲区
4  * @len 请求接收的字节数
5  * @flags 标志位
6  * 成功返回读取的字节数 失败返回-1
7  */
8 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建立了连接,则省略地址参数;

 1 /**
 2  * @sockfd socket文件描述符
 3  * @buf 待写入数据缓冲区
 4  * @len 请求写入数据长度
 5  * @flags 标志位
 6  * @dest_addr 目的地址
 7  * @addrlen 地址长度
 8  * 成功返回发送字节数 失败返回-1
 9  */
10 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
11                       const struct sockaddr *dest_addr, socklen_t addrlen);
 1 /**
 2  * @sockfd socket文件描述符
 3  * @buf 读取数据的缓冲区
 4  * @len 请求读取数据长度
 5  * @flags 标志位
 6  * @src_addr 源地址
 7  * @addrlen 地址长度
 8  * 成功返回读取字节数 失败返回-1
 9  */
10 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
11                         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消息头;参数以及返回值如下:

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

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

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

图片来自<unix网络编程>

原文地址:https://www.cnblogs.com/wanpengcoder/p/11749359.html

时间: 2024-10-07 15:10:38

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

sockets: 套接字的IO函数

########################################################### 套接字的IO函數 IO函数都涉及到阻塞问题,所以要考虑超时问题. 推荐使用sendmsg和recvmsg函数. 对socket的操作: #include<sys/types.h> #include <sys/socket.h> ssize_t recv(int sockfd, void*buff, size_t len, int flags); ssize_t s

TCP套接字编程常用函数

socket函数 这是一个进程在执行网络I/O之前必须调用的函数,用于指定期望的通信协议类型 #include <sys/socket.h> int socket(int family, int type, int protocol); // 调用成功返回非负的套接字描述符,出错返回-1 connect函数 TCP客户端用connect函数来建立与TCP服务器的连接 #include <sys/socket.h> int connect(int sockfd, const stru

套接字Socket

熟知套接字和应用层       必须有一种方法让你对指定的计算机打开连接,登录上去,告诉它你需要什么文件,并且控制文件的传输.(如果你想到不同的应用,例如计算机邮件,某种类似的协议也是需要的.)这个是由“应用层协议”完成的.应用层协议位于 TCP/IP协议的顶部.也就是说,当他们需要发送一个消息,他们会把那个消息交给TCP层.TCP层确保它输送到另一端.因为TCP层和IP层处理了所有的网络方面的细节,应用层协议可以认为一个网络连接是一个简单的字节流,就像一个终端或一条电话线.       在探究

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

ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html 翻译:风波 mail : [email protected] ————————————————————————————————————— ZeroMQ 官方地址:http://api.zeromq.org/4-0:zmq-socket zmq_socket(3)            ØMQ Manual - ØMQ/4.0 Name zmq_socket – 创建Z

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

基于TCP客户/服务器程序的套接字函数图如下: 执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型. #include <sys/socket.h> int socket(int family, int type, int protocol);/*返回值:若成功则为非负描述符,若出错则为-1*/ socket函数成功时返回一个小的非负整数值,它与文件描述符类似,把它称为套接字描述符,简称sockfd.family参数指明协议族,被称为协议域.type参数指

Unix网络编程随手记——套接字接口函数

套接字接口(socket interface)是一组函数,它们和Unix I/O函数结合起来,用以创建网络应用.大多数现代系统上都实现套接字接口,包括所有的Unix变种.Windows和Macintosh. 1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: 1 struct sockaddr 2 { 3 unsigned short sa_family; /* address族, AF_xxx */ 4 char sa_data[14]; /* 14

(一)理解网络编程和套接字

学习<TCP/IP网络编程> 韩 尹圣雨 著 金国哲 译 套接字类似电话 一.服务器端套接字(listening套接字)---接电话套接字 ①调用socket函数---安装电话机 #include <sys/socket.h> int socket(int domain, int type, int protocol); //成功时返回文件描述符,失败时返回-1 ②调用bind函数---分配电话号码 #include <sys/socket.h> int bind(in

网络套接字与寻址

1 套接字描述 套接字是通信端点的抽象,创建一个套接字使用如下函数: #include <sys/socket.h> int socket(int domain, int type, int protocol); 返回值:若成功,返回套接字描述符:若出错,返回-1. 参数: domain: 指定通信的特征,包括地址格式,以AF_开头的常数表示地址族(address family): 域 描述 AF_INET IPv4因特网域 AF_INET6 IPv6因特网域 AF_UNIX UNIX域 AF

sockets: 套接字选项相关的系统调用

########################################################### 套接字选项相关的系统调用: ########################################################### 将optval指向的单元中的值设置给optname选项: int setsockopt(int sockfd, int level, int optname, const void *optval,socklen_t optlen)