sendto()和recvfrom()——利用数据报方式进行数据传输
1.sendto()函数

在无连接的数据报socket方式下,由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址,sendto()函数原型为:
int sendto(int sockfd, const void *msg,int len,
unsigned int flags, const struct sockaddr *to, int tolen);
该函数比send()函数多了两个参数,to表示目地机的IP地址和端口号信息,而tolen常常被赋值为sizeof (struct sockaddr)。Sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。
2.recvfrom()函数
recvfrom()函数原型为: int recvfrom(int sockfd,void *buf,int len,
unsigned int lags,struct sockaddr *from,int *fromlen);
from是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。fromlen常置为 sizeof (struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。 recvfrom()函数返回接收到的字节数或当出现错误时返回-1,并置相应的errno。
应注意的一点是,当你对于数据报 socket调用了connect()函数时,你也可以利用send()和recv()进行数据传输,但该socket仍然是数据报socket,并且利 用传输层的UDP服务。但在发送或接收数据报时,内核会自动为之加上目地和源地址信息。
爱华网



