Linux Socket API Connect 函数详解

原创 2015年07月06日 18:04:21

在讲解套接字编程函数之前,有必要对socket编程的两个不可或缺的结构体进行说明。

第一个结构体式struct sockaddr.。这个结构为许多类型的套接字储存套接字地址信息:

 Sockaddr结构体介绍

1. #include<sys/socket.h>  
2.   
3. struct sockaddr {   
4.     uint8_t sa_len;     
5.     unsigned short sa_family; /* 地址家族, AF_xxx */      
6.     char sa_data[14]; /*14字节协议地址*/     
7. };   


由于历史的原因,套接字函数中(如connectbind等)使用的参数类型大多是sockaddr类型的。而如今进行套接字编程的时候大都使用sockaddr_in进行套接字地址填充

sockaddr_in结构体介绍

1. struct sockaddr_in {   
2.    uint8_t sa_len;   /* 结构体长度*/   
3.     short int sin_family; /* 通信类型 */   
4.    unsigned short int sin_port; /* 端口 */   
5.    struct in_addr sin_addr; /* Internet 地址 */   
6.    unsigned char sin_zero[8]; /* 未使用的*/   
7.    };  

1. struct in_addr {   //sin_addr的结构体类型in_addr 原型  
2.    unsigned long s_addr;     /*存4字节的 IP 地址(使用网络字节顺序)。*/  
3.    };   


因此,这就要求对这些函数进行调用的时候都必须要讲套接字地址结构指针进行类型强制转换,例如:

 

1. struct sockaddr_in serv;    
2. bind(sockfd,(struct sockaddr *)&serv,sizeof(serv));  

否则C编译器会产生警告信息(把不兼容的指针类型传递给“bind”函数的第二个参数)。(注意sockaddr_insin_port和 sin_addr 必须是网络字节顺序 (Network Byte Order)

Conncet函数介绍

connect() 系统调用函数原型如下所示:

1. #include <sys/types.h>;   
2. #include <sys/socket.h>;  
3. int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);   


sockfd 是系统调用 socket() 返回的套接字文件描述符。serv_addr 是 保存着目的地端口和 IP 地址的数据结构 struct sockaddraddrlen 设置 为 sizeof(struct sockaddr)
connect函数在调用失败的时候返回值-1,并会设置全局错误变量 errnoConnect 函数调用成功的时候返回0,并返回一个标示此连接。客户端就可以通过sockfd进行与服务端的通信。

 

如果是TCP套接字,调用connect会激发TCP的三路握手过程,首先发送SYN请求的报文给服务端,其出错返回设置errno变量值有如下几种:

(1) TCP没有收到SYN分节的响应,则返回 会设置 errno变量值为ETIMEDOUT

(2) 若对客户的SYN的响应是RST(表示复位),则表明该服务器主机在我们制定的端口上没有进程在等待与之连接(例如服务器进程或许没有在运行),此时errno 会设置为ECONNREFUSED错误。

(3) 若客户发出的SYN在中间的某个路由器引发了一个ICMP错误报文(例如主机不可达)。客户主机内核会保存该信息,并按一定的时间间隔继续发送SYN,如若在某个规定得时间内还没收到响应,则会把保存的消息作为EHOSTUNREACH返回给进程。

Linux Socket API Connect 函数详解

程函数之前,有必要对socket编程的两个不可或缺的结构体进行说明。 第一个结构体式struct sockaddr.。这个结构为许多类型的套接字储存套接字地址信息:  Sockaddr结构体介绍 ...
  • u010229420
  • u010229420
  • 2016年10月01日 09:49
  • 644

Linux下Socket编程----connect()函数的包裹函数介绍

Linux下Socket编程—-connect()函数的包裹函数介绍这里主要介绍的是在TCP连接中的应用connect()函数简介1. 功能: 用于客户端建立tcp连接,发起三次握手过程。 2. 原...
  • u011192270
  • u011192270
  • 2015年08月14日 13:25
  • 3935

linux网络编程之udp的connect趣谈

对于linux网络编程,UDP协议不是面向连接的协议,直接把数据报发送到链路层,至于能不能到达目的IP和端口,它不关注;大部分时候再编写代码时候只需要在sendto函数中指定你要发送的端口和IP地址就...
  • xinfeiyang0605021
  • xinfeiyang0605021
  • 2015年07月17日 22:51
  • 1310

connect函数返回值

对于客户机而言,要与服务器进行通信,需要向服务器发出连接请求。connect函数用于完成这项功能,该函数的具体信息如下表所示。 头文件 函数形式 int connect...
  • cuixingbing
  • cuixingbing
  • 2013年11月01日 19:57
  • 7137

connect函数详解

不得不说,客户端的connect函数和服务端的accept函数是一对好基友,如果客户端没有去connect, 那么服务端的accept会一直在那里傻傻地痴痴地等待,我们先来看看connect函数的原型...
  • stpeace
  • stpeace
  • 2013年10月29日 22:49
  • 11482

网络编程socket之connect函数

网络编程socket api存在一批核心接口,而这一批核心接口就是几个看似简单的函数,尽管实际上这些函数没有一个是简单。connect函数就是这些核心接口的一个函数,它完成主动连接的过程。    c...
  • u010951938
  • u010951938
  • 2015年04月03日 16:42
  • 2099

Windows Socket API函数

Windows Socket API函数 一、WSAStartup函数int WSAStartup(WOR...
  • hurtmanzc
  • hurtmanzc
  • 2007年04月12日 11:51
  • 5797

Linux socket非阻塞connect方法(一)

Linux非阻塞connect方法(linux non-blocking socket connect)
  • u011804580
  • u011804580
  • 2013年08月24日 15:11
  • 16384

linux下socket connect超时设置

今天发现自己的系统存在很严重缺陷,当前台关闭的时候后台就无法正常工作,原因很好定位,后台的socket连接超时时间过长,系统默认时间好像是75秒,于是找资料,根据下边文章中的内容解决了,把超时时间设为...
  • liangzhao_jay
  • liangzhao_jay
  • 2016年01月20日 10:34
  • 4264

linux socket的connect 超时

这个一般情况下是这样子来设置的: 1.将打开的socket设为非阻塞的,可以用fcntl(socket, F_SETFL, O_NDELAY)完成(有的系统用FNEDLAY也可). 2.发co...
  • yueguanyun
  • yueguanyun
  • 2016年05月17日 10:55
  • 820
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux Socket API Connect 函数详解
举报原因:
原因补充:

(最多只允许输入30个字)