socket send函数系列,彻底弄懂socket发送函数,可做参考手册

目录

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发送原理:

  • struct iovec为发送单元,void *iov_base指向一块内存缓冲区,unsigned int iov_len为缓冲区长度
  • int iovcnt为发送单元个数
  • writev函数和sendmsg发送操作类似


使用示例:

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);

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网心球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值