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

目录

1.系统调用流程

2 发送函数系列

2.1 send函数

2.2 sendto函数

2.3 sendmsg函数

2.4 write函数

2.5 writev函数


1.系统调用流程

socket send函数系列,彻底弄懂socket发送函数,可做参考手册_第1张图片

图 1


2 发送函数系列

2.1 send函数

send函数为套接字发送函数,需套接字进行connect操作才能使用。

#include 
#include 

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   
#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


2.3 sendmsg函数

sendmsg函数为套接字批量发送函数,不管套接字是否进行connect操作都能使用。

#include   
#include 

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

参数:
sockfd:套接字文件描述符
msg:发送消息体
flags:标识

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno

socket send函数系列,彻底弄懂socket发送函数,可做参考手册_第2张图片

图 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为缓冲区长度。

socket send函数系列,彻底弄懂socket发送函数,可做参考手册_第3张图片

图 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 

ssize_t write(int fd, const void *buf, size_t count);

参数:
fd:套接字文件描述符
buf:发送缓冲区
count:发送数据长度

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno

2.5 writev函数

writev函数为文件描述写操作,writev可用于套接字批量发送操作,writev套接字进行connect操作才能使用。

#include 

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

你可能感兴趣的:(Linux网络编程,linux,tcp/ip,物联网,网络,c语言)