程序代码:
#include <sys/socket.h>
ssize_t recvfrom ( int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);
ssize_t sendto ( int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t *addrlen)
这两个函数很类似与read() 和 write(), 却新增了3个额外的参数
recvfrom() , accept() , getsockname() , getpeername() 这几个函数都是把一个 socket address 从kernel 传到 process(有内到外)
而bind() , connect() , sendto() 这几个函数都是把一个 socket address 从process 传到 kernel ( 有外到内)
一个datagram的长度为0是可以接受的, UDP的情况下是
一个IP datagram 里包含IP header(IPv4 是 20字节,IPv6是40字节)
和一个8字节的 UDP header, 无数据。
这也就意味着 对于一个datagrad protocol 来说recvfrom() 返回 0 是可以被接受的,
这并不意味着对方关闭了链接。
这一点不象read()函数(如果在一个TCP socket上返回了0则是对方关闭了链接)
因为UDP是connectionless, 所以也没有关闭UDP 连接这一说法
recvfrom() 和 sendto() 都可以被用于TCP, 但实际上并没有这个必要
[ 本帖最后由 madfrogme 于 2012-11-20 17:48 编辑 ]