目录
1.系统调用流程
2 发送函数系列
2.1 send函数
2.2 sendto函数
2.3 sendmsg函数
2.4 write函数
2.5 writev函数
1.系统调用流程
图 1
2 发送函数系列
2.1 send函数
send函数为套接字发送函数,需套接字进行connect操作才能使用。
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
参数:
sockfd:套接字文件描述符
buf:发送缓冲区
len:发送数据长度
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
2.2 sendto函数
sendto函数为套接字发送函数,不管套接字是否进行connect操作都能使用。
- 未connect:
dest_addr:对端套接字地址
addrlen:套接字地址长度
- 已connect:
dest_addr:NULL
addrlen:0
#include <sys/types.h>
#include <sys/socket.h>
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
2.3 sendmsg函数
sendmsg函数为套接字批量发送函数,不管套接字是否进行connect操作都能使用。
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
参数:
sockfd:套接字文件描述符
msg:发送消息体
flags:标识
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
图 2 struct msghdr结构体解析
sendmsg发送原理:
- void *msg_name指定对端套接字地址,socklen_t msg_namelen为套接字地址长度,如果套接字已经进行connect操作,可以不指定对端套接字地址。
- struct iovec *msg_iov为发送单元结构体指针,指向一块连续的struct iovec区域,每一个区域为一个发送缓冲区,可以通过size_t msg_iovlen指定一次发送的缓冲区数量,从而完成批量发送操作。
- struct iovec为发送单元,void *iov_base指向一块内存缓冲区,unsigned int iov_len为缓冲区长度。
图 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);
2.4 write函数
write函数为文件描述写操作,可用于套接字发送操作,write和send区别为send函数需要指定flags标识。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd:套接字文件描述符
buf:发送缓冲区
count:发送数据长度
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
2.5 writev函数
writev函数为文件描述写操作,writev可用于套接字批量发送操作,writev套接字进行connect操作才能使用。
#include <sys/uio.h>
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
参数:
fd:套接字文件描述符
iov:发送单元结构体指针
iovcnt:发送单元数量
返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno
writev发送原理:文章来源:https://www.toymoban.com/news/detail-729887.html
- struct iovec为发送单元,void *iov_base指向一块内存缓冲区,unsigned int iov_len为缓冲区长度
- int iovcnt为发送单元个数
- writev函数和sendmsg发送操作类似
使用示例:文章来源地址https://www.toymoban.com/news/detail-729887.html
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);
到了这里,关于socket send函数系列,彻底弄懂socket发送函数,可做参考手册的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!