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套接字选项改动该值。

UDP连接调用connect()函数的更多相关文章

  1. udp调用connect有什么作用(转)

    原文链接如下: http://blog.csdn.net/wannew/article/details/18218619 整理一下.1:UDP中可以使用connect系统调用 2:UDP中connec ...

  2. DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数

    以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...

  3. connect函数的用法

    无论流式套接字(如TCP)还是数据报(如UDP),均可以使用connect函数.对于流式套接字,使用connect函数后,建立固定地址的连接,之后可以使用send/rev函数进行数据收发.对于数据报, ...

  4. connect函数

    TCP客户用connect函数来建立与TCP服务器的连接 int connect (int sockfd, const sockaddr * servaddr, socklen_t addrlen); ...

  5. 网络编程:connect函数

    TCP客户用connect函数来建立与TCP服务器的连接: cpp #include<sys/socket.h> int connect(int sockfd, const struct ...

  6. connect()函数阻塞问题

    方法一:采用select 在学习嵌入式Linux网络编程中,很多同学都发现了一个问题,那就是调用connect函数时,如果服务端关闭,客户 端调用connect()函数时,发现阻塞在那里,而且利用ct ...

  7. UDP的connect函数

    UDP的connect没有三次握手过程,内核只是检测是否存在立即可知的错误(如一个显然不可达的目的地), 记录对端的的IP地址和端口号,然后立即返回调用进程. 未连接UDP套接字(unconnecte ...

  8. UNIX网络编程——UDP 的connect函数(改进版)

    上一篇我们提到,除非套接字已连接,否则异步错误是不会返回到UDP套接字的.我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接大相径庭:没有三次握手.内核只是检查是否存在立即可 ...

  9. 非阻塞socket调用connect, epoll和select检查连接情况示例

    转自http://www.cnblogs.com/yuxingfirst/archive/2013/03/08/2950281.html 我们知道,linux下socket编程有常见的几个系统调用: ...

随机推荐

  1. zzulioj--1824--BOOM(模拟水)

    1824: BOOM Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 25  Solved: 5 SubmitStatusWeb Board Descr ...

  2. 实时监控Cat之旅~对Get和Post进行封装,支持分布式消息树

    对第三方接口的调用我们需要对GET和POST进行监控,看一些请求的执行是否成功,如A调用B,B调用C,C调用D,这一连串的东西需要我们使用cat进行记录,进行记录之后,我们可以很容易的发现请求响应的时 ...

  3. c# 对用户密码加密解密

    一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 ? 1 2 3 4 5 6 7 8 9 10 11 12 /// <summary> /// 16位MD5加密 ...

  4. nginx直接连接操作memcache

    原理:     Nginx 要设定一个 key 去查 mem ,如果没查到,要有一个回调 php ,并且 key 传给 php.     配置方式:     server{               ...

  5. 部分vivo和oppo手机,使用上传图片功能,可能会出现退出webview的现象(回退到app的入口页面)

    在公司的app里面嵌入了一个h5页面,h5页面有个使用图片上传功能,上传图片出现闪退的现象 问题描述:vivo手机,在app内的wap页面使用上传图片的功能,在选择好图片点击确认按钮后,出现退出整个w ...

  6. caioj 1081 动态规划入门(非常规DP5:观光游览)

    这道题和前面的分组的题有点像 就是枚举最后一组的长度. 然后组数可以在第一层循环也可以在第二层循环 我自己的话就统一一下在第一层循环吧 然后这道题题意我一直没理解清楚,浪费了很多时间,写复杂了 同时初 ...

  7. 紫书 例题 10-8 UVa 1262 (暴力枚举)

    递归一遍遍历所有情况就ok了 #include<cstdio> #include<cstring> #define REP(i, a, b) for(int i = (a); ...

  8. CRC校验原理及步骤

    什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并 ...

  9. 保存数据同一时候查询保存数据记录的ID

    保存数据时同一时候取出该数据的记录ID insert into Table(a,b) values(1,2) select @@identity

  10. avalon 作用域

    作用域绑定(ms-controller, ms-important) 如果一个页面非常复杂,就需要划分模块,每个模块交由不同的ViewModel去处理.我们就要用到ms-controller与ms-i ...