UDP连接调用connect()函数

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

8.11 UDP的connect函数

除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。

对于已连接UDP套接字,与默认的未连接UDP套接字相比,发生了三个变化。

(1)我们再也不能给输出操作指定目的IP地址和端口号。也就是说,我们不使用sendto,而改用write或send。写到已连接UDP套接字上的任何内容都自动发送到由connect指定的协议地址。可以给已连接的UDP套接字调用sendto,但是不能指定目的地址。sendto的第五个参数必须为空指针,第六个参数应该为0.

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

(3)由已连接UDP套接字引发的异步错误会返回给它们所在的进程,而未连接的UDP套接字不接收任何异步错误。

来自任何其他IP地址或断开的数据报不投递给这个已连接套接字,因为它们要么源IP地址要么源UDP端口不与该套接字connect到的协议地址相匹配。

UDP客户进程或服务器进程只在使用自己的UDP套接字与确定的唯一对端进行通信时,才可以调用connect。调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户长时间通信TFTP,这种情况下,客户和服务器都可能调用connect。

DNS提供了一个例子 DNS服务器进程通常是处理客户请求的,因此服务器进程不能调用connect。

8.11.1给一个UDP套接字多次调用connect

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

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

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

1连接套接字

2输出第一个数据报

3输出第二个数据报

8.13UDP缺乏流量控制

UDP套接字接收缓冲区

由UDP给某个特定套接字排队的UDP数据报数目受限于该套接字接收缓冲区的大小。可以使用SO_RCVBUF套接字选项修改该值。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 17:32:27

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

udp 调用connect函数

结论: udp可以调用connect函数. udp可以多次调用connect函数. udp调用connect作用: 发送端:我们不需要再次指定也不能指定端口和ip地址 接收端:不必使用类似recvfrom的函数来获得数据报的发送者,一个已连接的udp套接字只与一个ip地址交换数据 已连接的udp如果错误会返回给发送端 udp多次调用connect作用: 指定一个新的ip和端口 断开套接字 适用于udp一对一的经常不断发送数据的情况,可以提高效率. 比如: 未connect的udp发送数据为,建立

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

原文链接如下: http://blog.csdn.net/wannew/article/details/18218619 整理一下.1:UDP中可以使用connect系统调用 2:UDP中connect操作与TCP中connect操作有着本质区别. TCP中调用connect会引起三次握手,client与server建立连结.UDP中调用connect内核仅仅把对端ip&port记录下来. 3:UDP中可以多次调用connect,TCP只能调用一次connect. UDP多次调用connect有

connect函数的用法

无论流式套接字(如TCP)还是数据报(如UDP),均可以使用connect函数.对于流式套接字,使用connect函数后,建立固定地址的连接,之后可以使用send/rev函数进行数据收发.对于数据报,可以不使用connect函数进行连接.此时需要使用sendto/revfrom函数进行收发,且每一次收发都要指明收发地址.也可以像流式套接字那样使用connect函数建立固定连接,然后使用send/rev函数进行收发.此时不需要每次收发都指定地址,但是也意味着只能向一个固定地址收发数据.另外注意,一

linux 非阻塞 connect函数

开发测试环境:虚拟机CentOS,windows网络调试助手        非阻塞模式有3种用途        1.三次握手同时做其他的处理.connect要花一个往返时间完成,从几毫秒的局域网到几百毫秒或几秒的广域网.这段时间可能有一些其他的处理要执行,比如数据准备,预处理等.        2.用这种技术建立多个连接.这在web浏览器中很普遍.        3.由于程序用select等待连接完成,可以设置一个select等待时间限制,从而缩短connect超时时间.多数实现中,connec

connect函数

TCP客户用connect函数来建立与TCP服务器的连接 int connect (int sockfd, const sockaddr * servaddr, socklen_t addrlen); sockfd是由socket函数返回的套接字描述符 servaddr指向套接字地址结构的指针 addrlen指向该结构的大小的指针 客户在调用函数connect 之前不必非要调用bind函数,因为如果需要的话,内核会确定源IP地址,并选择一个临时端口作为源端口 如果是TCP套接字,调用connec

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

from http://www.cnblogs.com/yuxingfirst/archive/2013/03/08/2950281.html 我们知道,linux下socket编程有常见的几个系统调用: 对于服务器来说, 有socket(), bind(),listen(), accept(),read(),write() 对于客户端来说,有socket(),connect() 这里主要要讲的是客户端这边的connect函数. 对于客户端来说,需要打开一个套接字,然后与对端服务器连接,例如:

如何在sqlite3连接中创建并调用自定义函数

#!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sqlite3连接中创建并调用自定义函数''' import sqlite3,hashlib #自定义函数 def md5sum(t): return hashlib.md5(t).hexdigest() #在内存中创建临时数据库 conn = sqlite3.connect(":memory:"

【网络编程】——connect函数遇见EINTR的处理

最近在公司项目中突然报错如下 “connect: Interrupted system call”, 经过查找代码发现是在创建 socket 中执行了 connect 函数失败导致.上网查阅资料发现这是 信号中断EINTR 与 慢系统调用 的问题. 慢系统调用:可能永远阻塞的系统调用. EINTR说明:如果进程在一个慢系统调用(slow system call)中阻塞时,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“In

QT QObject::connect函数的学习

从Qobject(QObject.h)源码中可以看到QObject::connect的定义是这样的: [cpp] view plaincopy static bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType = #ifdef qdoc Qt::AutoConnection #else #ifdef QT3_S