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. IIS应用程序池自动停止,报503错误解决方法

    前两天遇见一个问题,部署网站之后,浏览时总是报503,找了半天才发现是用户权限问题,现在记录一下,方便以后遇到的大伙快速解决问题,以至于不会浪费太多时间 解决方法: 应 用程序-特定 权限设置未将 C ...

  2. web实现负载均衡的几种实现方式

    摘要: 负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用是Web负载均衡.根据实现的 ...

  3. 详细了解下PHP的curl函数及常用之处

    CURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.正因为这么强大,当然PHP也支持 CURL 库,前提是你的ph ...

  4. linux下如何关闭某个tmux窗口

    答:分成两个步骤,如下: 1.列出当前的tmux窗口 jello@jello:~$ tmux ls 1: 1 windows (created Tue Jan 17 09:28:05 2019) [2 ...

  5. The P4 Language Specification v1.0.2 Introduction部分

    Introduction P4 is a declarative language for expressing how packets are processed by the pipeline o ...

  6. 使用ntpdate工具校正linux服务器时间

    当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210 ...

  7. python 判断两个列表是否有公共元素

    def common_data(list1, list2): result = False for x in list1: for y in list2: if x == y: result = Tr ...

  8. C#使用(NamedPipe)命名管道通信的例子

    https://blog.csdn.net/yl2isoft/article/details/20228279

  9. angular 自定义指令参数详解

    restrict:指令在dom中的声明形式 E(元素)A(属性)C(类名)M(注释) priority优先级:一个元素上存在两个指令,来决定那个指令被优先执行 terminal:true或false, ...

  10. Filter实现session超时自动跳转到login页,超过试用期不许登录

    新建一个过滤器 package com.autumn.filter; import com.autumn.pojo.Users; import javax.servlet.*; import java ...