Linux Socket API Connect 函数详解
2015-07-06 18:04
507 查看
在讲解套接字编程函数之前,有必要对socket编程的两个不可或缺的结构体进行说明。
第一个结构体式struct sockaddr.。这个结构为许多类型的套接字储存套接字地址信息:
由于历史的原因,套接字函数中(如connect,bind等)使用的参数类型大多是sockaddr类型的。而如今进行套接字编程的时候大都使用sockaddr_in进行套接字地址填充
因此,这就要求对这些函数进行调用的时候都必须要讲套接字地址结构指针进行类型强制转换,例如:
否则C编译器会产生警告信息(把不兼容的指针类型传递给“bind”函数的第二个参数)。(注意sockaddr_in的sin_port和 sin_addr 必须是网络字节顺序 (Network Byte Order))
sockfd 是系统调用 socket() 返回的套接字文件描述符。serv_addr 是 保存着目的地端口和 IP 地址的数据结构 struct sockaddr。addrlen 设置 为 sizeof(struct sockaddr)。
connect函数在调用失败的时候返回值-1,并会设置全局错误变量 errno。Connect 函数调用成功的时候返回0,并返回一个标示此连接。客户端就可以通过sockfd进行与服务端的通信。
如果是TCP套接字,调用connect会激发TCP的三路握手过程,首先发送SYN请求的报文给服务端,其出错返回设置errno变量值有如下几种:
(1) 若TCP没有收到SYN分节的响应,则返回 会设置 errno变量值为ETIMEDOUT。
(2) 若对客户的SYN的响应是RST(表示复位),则表明该服务器主机在我们制定的端口上没有进程在等待与之连接(例如服务器进程或许没有在运行),此时errno 会设置为ECONNREFUSED错误。
(3) 若客户发出的SYN在中间的某个路由器引发了一个ICMP错误报文(例如主机不可达)。客户主机内核会保存该信息,并按一定的时间间隔继续发送SYN,如若在某个规定得时间内还没收到响应,则会把保存的消息作为EHOSTUNREACH返回给进程。
第一个结构体式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. };
由于历史的原因,套接字函数中(如connect,bind等)使用的参数类型大多是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_in的sin_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 sockaddr。addrlen 设置 为 sizeof(struct sockaddr)。
connect函数在调用失败的时候返回值-1,并会设置全局错误变量 errno。Connect 函数调用成功的时候返回0,并返回一个标示此连接。客户端就可以通过sockfd进行与服务端的通信。
如果是TCP套接字,调用connect会激发TCP的三路握手过程,首先发送SYN请求的报文给服务端,其出错返回设置errno变量值有如下几种:
(1) 若TCP没有收到SYN分节的响应,则返回 会设置 errno变量值为ETIMEDOUT。
(2) 若对客户的SYN的响应是RST(表示复位),则表明该服务器主机在我们制定的端口上没有进程在等待与之连接(例如服务器进程或许没有在运行),此时errno 会设置为ECONNREFUSED错误。
(3) 若客户发出的SYN在中间的某个路由器引发了一个ICMP错误报文(例如主机不可达)。客户主机内核会保存该信息,并按一定的时间间隔继续发送SYN,如若在某个规定得时间内还没收到响应,则会把保存的消息作为EHOSTUNREACH返回给进程。
相关文章推荐
- centos安装ssh免密码登录
- Linux内核OOM机制分析
- Linux下调整目录的空间大小
- linux 环境变量设置方法总结(PATH / LD_LIBRARY_PATH)
- Linux: Start and Enable firewall
- Linux Sendfile 的优势
- ubuntu中安装jdk 分类: java 学习笔记 linux ubuntu 2015-07-06 17:49 74人阅读 评论(0) 收藏
- Linux中link,unlink,close,fclose详解
- (转)初识suse——linux
- Linux下查看文件内容的命令 (
- Linux Socket编程注意事项
- linux配置NTP Server
- linux系统安装activeMQ
- linux学习笔记一——sudo:无法切换为sudoers组ID:不允许的操作
- LInux下编译发生的libc相关错误
- linux 添加交换分区
- linux 磁盘分区
- 如何在Linux下监控系统温度
- 查看CentOS版本方法
- Linux——基本概念及操作