AnSwErYWJ's Blog

UNIX网络编程-connect函数及其包裹函数介绍

字数统计: 397阅读时长: 8 min
2016/07/14

本文将介绍UNIX网络编程中connect函数及其包裹函数。

函数简介

1
2
3
4
5
#include<sys/socket.h>
#include<sys/types.h>

int connect(int sockfd, const struct sockaddr* server_addr, socklen_t addrlen);
返回值:若成功返回0;若失败则返回-1.

connect函数用于客户端建立tcp连接,发起三次握手过程。其中sockfd标识了主动套接字,server_addr是该套接字要连接的主机地址和端口号,addrlenserver_addr缓冲区的长度。

连接失败时,可以根据以下errno值判断失败的原因:

1
2
3
4
5
6
7
8
9
EBADF:参数sockfd 非合法socket处理代码;
EFAULT:参数serv_addr指针指向无法存取的内存空间;
ENOTSOCK:参数sockfd为一文件描述词,非socket;
EISCONN:参数sockfd的socket已是连线状态;
ECONNREFUSED:连线要求被server端拒绝;
ETIMEDOUT:企图连线的操作超过限定时间仍未有响应;
ENETUNREACH:无法传送数据包至指定的主机;
EAFNOSUPPORT:sockaddr结构的sa_family不正确;
EALREADY:socket为不可阻塞且先前的连线操作还未完成;

包裹函数(下载)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<sys/socket.h>
#include<sys/types.h>
#include<stdlib.h>

#define MAXSLEEP 128

int my_connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen)
{
int nsec;
for(nsec = 1;nsec <= MAXSLEEP;nsec <<= 1)
{
if(connect(sockfd,servaddr,addrlen) == 0)
return 0;//connection accepted
if(nsec <= MAXSLEEP/2)//sleep nesc,then connect retry
sleep(nsec);
}
return -1;
}

包裹函数为connect函数设置了超时重连的机制,如果连接成功,则成功返回。如果连接失败,则每次等待1、2、4、8。。。秒后继续尝试重新连接,直到MAXSLEEP为止。

原文作者:AnSwErYWJ

原文链接:https://answerywj.com/2016/07/14/connect-in-unix/

发表日期:2016/07/14 14:07

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

CATALOG
  1. 1. 函数简介
  2. 2. 包裹函数(下载)