UDP的connect没有三次握手过程,内核只是检测是否存在立即可知的错误(如一个显然不可达的目的地),

记录对端的的IP地址和端口号,然后立即返回调用进程。

未连接UDP套接字(unconnected UDP socket):新创建UDP套接字默认如此;

已连接UDP套接字(connected UDP socket):对UDP套接字调用connect的结果。

对于已连接UDP套接字,与默认的未连接UDP套接字相比:

1)再不能给输出操作指定目的IP地址和端口号。

sendto改用write或send,写到已连接UDP套接字上的任何内容都自动发送到由connect指定的协议地址(如IP地址和端口号)。

已连接UDP套接字调用sendto,不能指定目的地址。其第五个参数必须为空指针,第六个参数应为0或不考虑。

2)可不使用recvfrom以获悉数据报的发送者,改用read、recv或recvmsg。

在已连接UDP套接字上,由内核为输入操作返回的数据报只有来自connect所制定协议地址的数据报。

这样就限制一个已连接UDP套接字能且仅能与一个对端交换数据报。

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

POSIX规范指出,在未连接UDP套接字上不指定目的地址的输出操作应该返回ENOTCONN,而不是EDESTADDRREQ。

应用进程首先调用connect指定对端的IP地址和端口号,然后使用read和write与对端进程交换数据。

来自任何其他IP地址或端口的数据报不投递给这个已连接套接字,UDP将丢弃它们并生成相应的ICMP端口不可达错误。

UDP客户进程或服务器进程只在使用自己的UDP套接字与确定的唯一对端进行通信时,才可以调用connect。

调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户长时间通信(如TFTP),此时客户和服务器都有可能调用connect。

DNS客户、服务器与connect函数的例子:

用于一个已连接UDP套接字的进程可出于以下目的之一会再次调用connect:

1)指定新的IP地址和端口号

2)断开套接字

断开一个已连接的udp套接字,再次调用connect函数时,把套接字的地址结构的地址族成员(IPv4:sin_family;IPv6:sin6_famliy)设置为AF_UNSPEC会返回一个EAFNOSUPPORT错误,

在未连接到udp套接字上调用sendto时:

1.连接套接字

2.输出第一个数据报

3.断开套接字链接

4.链接套接字

5.输出第二个数据报

6.断开套接字的连接

connect后两次write

1.连接套接字

2.输出第一个数据报

3.输出第二个数据报

性能:当进程知道自己要给同一个目的地址发送多个数据报时,显式连接套接字效率更高。

而临时连接未连接的UDP套接字大约会消耗每个UDP传输三分之一的开销

void dg_cli(FILE *fp, int sockfd, SA *pservaddr, socklen_t servlen)
{
    int n;
    ];
    ){
        cout<<"conn error!"<<endl;
        exit();
    }
    else
        cout<<"conn succ!"<<endl;

    while (fgets(sendline, MAXLINE, fp) != NULL){
        ){
            cout<<"write error"<<endl;
            exit();
        }

        ){
            cout<<"read error"<<endl;
            exit();
        }

        recvline[n] = ;
        fputs(recvline, stdout);

        bzero(sendline, MAXLINE);
        bzero(recvline, MAXLINE);
    }
}

UDP的connect的更多相关文章

  1. UDP的connect函数

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

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

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

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

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

  4. UDP中使用bind和connect的作用

    1:UDP中可以使用connect系统调用 2:UDP中connect操作与TCP中connect操作有着本质区别. TCP中调用connect会引起三次握手,client与server建立连结.UD ...

  5. UDP连接调用connect()函数

    UDP是一个无连接的协议,它没有像TCP中EOF之类的东西. 8.11 UDP的connect函数 除非套接字已连接,否则异步错误是不会反悔到UDP套接字的. 我们确实能够给UDP套接字调用conne ...

  6. UDP编程中的connect

    标准的udp客户端开了套接口后,一般使用sendto和recvfrom函数来发数据,最近看到ntpclient的代码里面是使用send函数直接法的,就分析了一下,原来udp发送数据有两种方法供大家选用 ...

  7. 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  8. python网络编程【二】(使用UDP)

    UDP通信几乎不使用文件对象,因为他们往往不能为数据如何发送和接受提供足够的控制.下面是一个基本的UPD客户端: #!/usr/bin/env python import socket,sys hos ...

  9. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

随机推荐

  1. Struts2中struts.multipart.maxSize配置

    今天使用Struts2的文件上传控件时,在struts.xml中,将处理上传的action中的fileUpload拦截器的maximumSize参数设置为5000000,上传了一个3M的文件后发现控制 ...

  2. php面向对象多继承实现

    在PHP面向对象概念编程中,一个子类只能继承一个父类,但是从php5.4后新增traits实现代码复用机制变向达到多继承.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立 ...

  3. jz2440-uboot-201204版本移植【学习笔记】【原创】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山二期视频学习笔记 交叉编译工具:arm-linux-gcc (GCC)4.3.2 PC环境:ubuntu18.04 一.uboot ...

  4. 【联网】虚拟机下Linux(终端)配置网络的方法

    这几天在虚拟机vmware上部署centos系统,想通过内部联网用yum命令安装必需的软件,但是一直不能静态地址联网,今天终于找到一个方法centos内部设置IP,对外联网.设置过程如下: 1.首先是 ...

  5. Redis之Set 集合

    Redis Set 集合 Set 就是一个集合,集合的概念就是一堆不重复值的组合.利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据. 比如在 微博应用中,可以将一个用户所有的关注人 ...

  6. python 字典添加元素

    d = {:, :} print(d) d.update({:}) print(d)

  7. PHP自定义XML类实现数组到XML文件的转换

    这两天在公司写和各应用商店应用内搜索的接口,大致就像百度应用内搜索这样的东西,具体可以点下面的链接查看. 百度应用内搜索 有的应用商店需要JSON格式的数据,所以我只需要用下面的语句就可以返回对方服务 ...

  8. Hadoop Ambari 安装

    ambari 1.2.4 下载地址:http://www.apache.org/dist/incubator/ambari/ambari-1.2.4/ambari-1.2.4-incubating.t ...

  9. 转-Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042   1)BIOS自检2)启动Grub/Lilo3)加 ...

  10. 2-13 搭建LAMP环境并部署Ucenter和Ucenter-home网站

    环境: VMware Virtual Machine : XGan63.cn IP: 192.168.31.63 (Bridge) 已配置本地yum源 ---> /mnt 已配置网络yum源 - ...