TCP/IP-connect函数

int connect (int sockfd,struct sockaddr * serv_addr,int addrlen); //connect函数通常用于客户端建立tcp连接

调用connect函数将会激发TCP/IP的三路握手过程,而且仅在连接建立成功或出错时才返回,其中出错返回可能有以下几种情况:

(1)  若TCP客户端没有收到SYN分节的响应,则返回ETIMEDOUT错误。举例说,调用connect函数时,4.4BSD内核发送一个SYN,若无响应则等待6s后再发送一个,若仍无响应则等待24s再发送一个。若总共等了75s后仍未收到响应则返回本错误。(注:sockfd默认是阻塞模式,非阻塞模式请参考文章:socket超时详解)

(2) 若对客户端的SYN的响应是RST(表示复位),则表明该服务器主机在我们指定的端口上没有进程在等待与之连接(例如服务器进程也许没在运行)。这是一种硬错误,客户端一接受到RST就马上返回ECONNREFFUSED错误。

  注:RST错误是TCP在发生错误时发送的一种TCP分节。产生RST的三个条件是:

(a)目的地为某端口的SYN抵达,然而该端口上没有监听的服务器。

(b)TCP想取消一个已有连接。

(c)TCP接收到一个根本不存在的连接上的分节。

(3) 若客户端发出的SYN在中间的某个路由器上引发了一个“destination unreachable”(目的地不可达)ICMP错误,则认为是一种软错误。客户端主机内核保存该消息,并按第一种情况中所述的时间间隔继续发送SYN。若在规定的时间后仍未收到响应,则把保存的消息作为EHOSTUNREACH或ENETUNREACH错误返回给客户端。以下两种情况也是有可能的:一是按照本地系统的转发表,根本没有达到远程系统的路径;二是connect调用根本不等待就返回。

客户端连接服务器伪代码:

1 int sockfd = socket(AF_INET, SOCK_STREAM, 0); //TCP
2  
3 short port = 9527; //服务器端口
4 struct sockaddr_in servaddr;
5 servaddr.sin_family = AF_INET; //IPv4
6 servaddr.sin_addr.s_addr = inet_addr("192.168.1.101"); //服务器地址
7 servaddr.sin_port = htons(port);
8  
9 int res = connect(sockfd, (sockaddr *)&servaddr, sizeof(sockaddr_in));

 

(1)SOCKET中连接过程比较
connect是套接字连接操作,connect操作之后代表对应的套接字已连接,UDP协议在创建套接字之后,可以同多个服务器端建立通信,而TCP协议只能与一个服务器端建立通信,TCP不允许目的地址是广播或多播地址,UDP允许。当然UDP协议也可以像TCP协议一样,通过connect来指定对方的ip地址、端口。
      UDP协议经过connect之后,在通过sendto来发送数据报时不需要指定目的地址、端口,如果指定了目的地址、端口,那么会返回错误。通过UDP协议可以给同一个套接字指定多次connect操作,而TCP协议不可以,TCP只能指定一次connect操作。UDP协议指定第二次connect操作之后会先断口第一次的连接,然后建立第二次的连接。


(2)客户端在建立同服务器端的连接过程
第一步都会通过socket建立连接套接字;
第二步通过bind来绑定本地地址、本地端口,当然绑定操作可以不用指定;
      对于UDP协议:若未指定绑定操作,那么可以通过下面connect操作来由内核负责套接字的绑定操作,若
connect又未指定,那么绑定操作只好通过套接字的写操作(sendto、sendmsg)来指定目的地址、端口,这时
套接字本地地址不会指定,为通配地址,而本地端口由内核指定,第一次sendto操作之后,插口的本地端口经
过内核指定之后就不会更改。
     对于TCP协议:若未指定绑定操作,可以通过下面connect操作来由内核负责套接字的绑定操作。内核会根
据套接字中的目的地址来判断外出接口,然后指定该外出接口的IP地址为插口的本地地址。Connect操作对于TCP
协议的客户端是必不可少的,必须指定。

转载于:https://www.cnblogs.com/1119reya/p/10381958.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值