UDP相关

1. UDP的connect函数,给udp进行了链接,那么udp的异步错误是不会返回到udp套接字的。

2. 所以说,一般情况下,不connect的udp是不知道对面有没有错的,如果有错,那真的是晕啊。因为万一对面服务挂了,客户端一直都不知道,一直等到死。

3.对于已连接的udp, (比较适合长时间通信的需求)

                 1. 我们不能使用sendto,而改用write,send,

                  2.不使用recvfrom,而改用read,recv,recvmsg

                3.异步错误会返回给用户进程,而未连接的不会返回

4.再次调用connect有2个目的:1.指定新的ip和端口 (指定新的即可)2.断开套接字 (family成员设置为AF_UNSPEC:sin_family,sin6_family)

对于tcp来说,connect只能调用一次,万万不可调用2次。TCP层为连接状态的维持保留有一段时间,在这段时间内连接状态没有被修改之前是不允许重复connect的。TCP的有一个种2MSL等待时间。

5.udp在发送数据的时候才知道链接不上,而tcp还没有发送数据的时候,就已经知道链接不上鸟。

6.另外,udp缺乏流量控制,udp发送端淹没接收端是轻而易举的事情。因套接字满而丢弃鸟。高级udp编程时再讲解如何给udp程序增加一些可靠性。

7.

为什么说tcp与udp端口相互独立

封装时包头信息不一样,任意帧在网络上可以区分出是UDP包还是TCP包,所以即使IP地址和端口相同,也不会导致冲突。
    端口号表示发送进程和接收进程。在图1.8中,我们画出了TCP和UDP用目的端口号
来分用来自IP层的数据的过程。由于IP层已经把IP数据报分配给TCP或UDP(根据IP首部
中协议字段值),因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号
与UDP端口号是相互独立的。

(下面是原书p.144①的译文)
    尽管相互独立,如果TCP和UDP同时提供某种知名服务,两个协议通常选择相同的端
口号。这纯粹是为了使用方便,而不是协议本身的要求。

二。高级udp套接字编程 



你可能感兴趣的:(UDP相关)