Beej’s Guide Network to Programming 系列连载15
5.8. sendto()和recvfrom() ---和我说话,数据报
“这很不错啊”,你说,“但是你还没有讲无连接数据报套接字呢?” 没问题,现在我们开始这个内容。
既然数据报套接字不是连接到远程主机的,那么在我们发送一个包之前需要什么信息呢? 不错,是目标地址!
sendto()函数原型:
int sendto(intsockfd, const void *msg, int len, unsigned int flags,
const struct sockaddr *to, socklen_ttolen);
你已经看到了,除了另外的两个信息外,其余的和函数 send() 是一样的。 to 是个指向数据结构 struct sockaddr 的指针,它包含了目的地的IP 地址和端口信息。tolen 可以简单地设置为sizeof(struct sockaddr)。 和函数 send() 类似,sendto()返回实际发送的字节数(它也可能小于你想要发送的字节数!),或者在错误的时候返回-1。
recvfrom()函数原型:
int recvfrom(intsockfd, void *buf, int len, unsigned int flags,
struct sockaddr *from, int *fromlen);
又一次,除了两个增加的参数外,这个函数和 recv() 也是一样的。from 是一个指向局部数据结构 struct sockaddr 的指针,它的内容是源机器的IP 地址和端口信息。fromlen 是个 int 型的局部指针,它的初始值为 sizeof(struct sockaddr)。函数调用返回后,fromlen保存着实际储存在 from 中的地址的长度。
recvfrom() 返回收到的字节长度,或者在发生错误后返回 -1。
摘自 xiaobin_HLJ80的专栏