目录
1.系统调用流程
2 发送函数系列
2.1 send函数
2.2 sendto函数
2.3 sendmsg函数
2.4 write函数
2.5 writev函数
图 1
send函数为套接字发送函数,需套接字进行connect操作才能使用。
#include
#include
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
参数:
sockfd:套接字文件描述符
buf:发送缓冲区
len:发送数据长度
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
sendto函数为套接字发送函数,不管套接字是否进行connect操作都能使用。
dest_addr:对端套接字地址
addrlen:套接字地址长度
dest_addr:NULL
addrlen:0
#include
#include
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
参数:
sockfd:套接字文件描述符
buf:发送缓冲区
len:发送数据长度
flags:标识
dest_addr:对端套接字地址
addrlen:对端套接字地址长度
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
sendmsg函数为套接字批量发送函数,不管套接字是否进行connect操作都能使用。
#include
#include
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
参数:
sockfd:套接字文件描述符
msg:发送消息体
flags:标识
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
图 2 struct msghdr结构体解析
sendmsg发送原理:
图 3
使用示例:
struct sockaddr_in peer;
memset(&peer, 0, sizeof(peer));
peer.sin_family = AF_INET;
peer.sin_addr.s_addr = inet_addr(IP);
peer.sin_port = htons(PEER_PORT);
struct iovec iov[2] = {0};
iov[0].iov_base = send_buf1;
iov[0].iov_len = strlen(REQUEST_STR1);
iov[1].iov_base = send_buf2;
iov[1].iov_len = strlen(REQUEST_STR2);
struct msghdr msg = {0};
msg.msg_name = &peer;
msg.msg_namelen = sizeof(peer);
msg.msg_iov = iov;
msg.msg_iovlen = 2;
sendmsg(sockfd, &msg, 0);
write函数为文件描述写操作,可用于套接字发送操作,write和send区别为send函数需要指定flags标识。
#include
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd:套接字文件描述符
buf:发送缓冲区
count:发送数据长度
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
writev函数为文件描述写操作,writev可用于套接字批量发送操作,writev套接字进行connect操作才能使用。
#include
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
参数:
fd:套接字文件描述符
iov:发送单元结构体指针
iovcnt:发送单元数量
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
writev发送原理:
使用示例:
struct iovec iov[2] = {0};
iov[0].iov_base = send_buf1;
iov[0].iov_len = strlen(REQUEST_STR1);
iov[1].iov_base = send_buf2;
iov[1].iov_len = strlen(REQUEST_STR2);
writev(sockfd, iov, 2);