zoukankan      html  css  js  c++  java
  • UDP连接调用connect()函数

    UDP是一个无连接的协议,它没有像TCP中EOF之类的东西。

    8.11 UDP的connect函数
    除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。

    我们确实能够给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核仅仅是检查是否存在马上可知的错误。记录对端的IP地址和port号,然后马上返回调用进程。


    对于已连接UDP套接字,与默认的未连接UDP套接字相比,发生了三个变化。
    事实上一旦UDP套接字调用了connect系统调用,那么这个UDP上的连接就变成一对一的连接,可是通过这个UDP连接数据传输的性质还是不变的,仍然是不可靠的UDP连接。一旦变成一对一的连接。在调用系统调用发送和接受数据时也就能够使用TCP那一套系统调用了。
    (1)我们再也不能给输出操作指定目的IP地址和port号。也就是说,我们不使用sendto,而改用write或send。

    写到已连接UDP套接字上的不论什么内容都自己主动发送到由connect指定的协议地址。能够给已连接的UDP套接字调用sendto。可是不能指定目的地址。sendto的第五个參数必须为空指针。第六个參数应该为0.

    (2)不必使用recvfrom以获悉数据报的发送者,而改用read、recv或recvmsg。在一个已连接UDP套接字上,由内核为输入操作返回的数据报仅仅有那些来自connect指定协议地址的数据报。这样就限制一个已连接UDP套接字能且仅能与一个对端交换数据报。

    (3)由已连接UDP套接字引发的异步错误会返回给它们所在的进程,而未连接的UDP套接字不接收不论什么异步错误。
    来自不论什么其它IP地址或断开的数据报不投递给这个已连接套接字。由于它们要么源IP地址要么源UDPport不与该套接字connect到的协议地址相匹配。

    UDP客户进程或server进程仅仅在使用自己的UDP套接字与确定的唯一对端进行通信时,才干够调用connect。调用connect的一般是UDP客户,只是有些网络应用中的UDPserver会与单个客户长时间通信TFTP,这样的情况下。客户和server都可能调用connect。

    DNS提供了一个样例 DNSserver进程一般是处理客户请求的。因此server进程不能调用connect。

    8.11.1给一个UDP套接字多次调用connect
    拥有一个已连接UDP套接字的进程可出于下列两个目的之中的一个再次调用connect:指定新的IP地址和port号。

    port套接字。

    为了断开一个已UDP套接字连接,再次调用connect时把套接字地址结构的地址族设置为AF_UNSPEC。

    当应用进程知道自己要给同一目的地址发送多个数据报时。显式连接套接字效率更高。调用connect后调用两次write涉及内核运行
    1连接套接字
    2输出第一个数据报
    3输出第二个数据报

    8.13UDP缺乏流量控制
    UDP套接字接收缓冲区
    由UDP给某个特定套接字排队的UDP数据报数目受限于该套接字接收缓冲区的大小。能够使用SO_RCVBUF套接字选项改动该值。
  • 相关阅读:
    WebView loadData乱码问题
    记录常用工具
    android toolbar学习
    百度地图V5.0地图定位
    JS调JAVA代码
    开始使用Android Stdio
    记录下平时看到的好句子
    开发者必备网址
    android:ellipsize实现跑马灯效果总结
    seo查询命令
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6951708.html
Copyright © 2011-2022 走看看