send() | sendto()|recv() | recvfrom()

#include <sys/types.h>  
#include <sys/socket.h>  
​  
ssize_t send(int sockfd, const void *buf, size_t len, int flags);  
​  
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);  
//成功返回发生的字节数,失败返回-1  
//参数  
 sockfd:套接字  
 buf:发送内容的首地址  
 len:请求发送的字节数  
 flags:默认填0  
 dest_addr:接收方地址结构的首地址  
 addrlen:接收方地址结构的长度

在调用send()函数时,需要注意以下几点:

  • 发送操作可能会阻塞,直到发送缓冲区中的数据被完全传输或发生错误。

  • 如果要发送的数据长度大于发送缓冲区的大小,数据将被分成多个数据包进行发送。

  • 一般情况下,TCP协议保证数据包的有序性,即发送的数据包将按照发送的顺序到达远程主机。但是,如果数据包经过多个网络节点传输,可能会出现乱序现象,需要使用TCP协议的确认机制进行重传和排序。

  • 如果使用带外数据传输(OOB)发送数据,需要使用MSG_OOB标志。

在调用sendto()函数时,需要注意以下几点:

  • 发送操作可能会阻塞,直到发送缓冲区中的数据被完全传输或发生错误。

  • 如果要发送的数据长度大于发送缓冲区的大小,数据将被分成多个数据包进行发送。

  • UDP协议不保证数据包的有序性,即发送的数据包不一定按照发送的顺序到达远程主机。如果需要保证有序性,需要在应用层使用序号进行排序。

  • 在未连接的套接字上使用sendto()函数发送数据时,需要指定目标主机的地址和端口号,否则发送的数据将无法到达目标主机。

#include <sys/types.h>  
#include <sys/socket.h>  
​  
ssize_t recv(int sockfd, void *buf, size_t len, int flags);  
​  
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);  
//成功返回发生的字节数,失败返回-1  
//参数  
 sockfd:套接字  
 buf:发送内容的首地址  
 len:请求发送的字节数  
 flags:默认填0  
 sec_addr:发送方地址结构的首地址  
 addrlen:发送方地址结构的长度

recvfrom() 函数与 recv() 函数类似,都是用于从套接字中接收数据。不同之处在于,recvfrom() 函数可以从未连接套接字(如 SOCK_DGRAM 类型的套接字、UDP)中接收数据,并返回数据发送者的地址信息。