http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net
分类: LINUX
2011-09-20 21:33:17
写一个长度为0的数据是可行的,这导致一个包含ip头部、8字节udp头部和没有数据的ip数据报。这也意味着对于数据报协议,recvfrom返回0也是可行的:它不代表对方已关闭了连接,这与tcp套接口上的read返回0的情形不同。由于udp是无连接的,这就没有诸如关闭udp连接之类的事情。
8.8 验证接收到的响应在多宿服务器上,recvfrom返回的ip地址有可能不是我们所发送数据报的目的ip地址,此时的解决办法有:
1)给定由recvfrom返回的ip地址后,由客户在DNS中查找服务器主机的名字来验证相应主机的域名而不是它的ip地址;
2)由udp服务器给服务器主机上配置的每个ip地址创建一个套接口,绑定相应的ip地址到此套接口,然后在所有这些套接口上使用select(等待其中人一个成为可读),再从可读的套接口作应答。由于用于应答的套接口绑定了客户请求的ip地址(否则该数据报不会投送到此套接口上),这就保证应答的源地址与请求的目的地址相同。
8.10 UDP程序例子小结 对于UDP套接口,目的IP地址只能为IPv4设置IP_RECVDSTADDR套接口选项或为IPv6设置IPV6_PKTINFO套接口选项,然后调用recvmsg而不是recvfrom来得到。由于udp是无连接的,因此目的ip地址可随发送到服务器哦的每个数据报而改变。
8.11 UDP的connect函数
对于已连接的udp套接口,进程可给那个套接口再次调用connect以达到下面两个目的之一:
1)指定新的ip地址和端口号;
2)断开套接口
在未连接udp套接口上给两个数据报调用函数sendto导致内核执行下列六步:
1)连接套接口;
2)输出第一个数据;
3)断开套接口;
4)连接套接口;
5)输出第二个数据报;
6)断开套接口连接。
当采用连接套接口时,效率更高,其步骤为:
1)连接套接口;
2)输出第一个数据报;
3)输出第二个数据报。
在这种情况下,内核拷贝一次含有目的ip地址和端口的套接口地址结构,而当调用两次sendto时,要拷贝两次。临时连接未连接的udp套接口将花去每个udp传输三分之一的消耗。