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)中接收数据,并返回数据发送者的地址信息。