Linux Socket API Connect 函数详解
在讲解套接字编程函数之前,有必要对socket编程的两个不可或缺的结构体进行说明。
第一个结构体式struct sockaddr.。这个结构为许多类型的套接字储存套接字地址信息:
Sockaddr结构体介绍
#include<sys/socket.h>
struct sockaddr {
uint8_t sa_len;
unsigned short sa_family; /* 地址家族, AF_xxx */
char sa_data[14]; /*14字节协议地址*/
};
由于历史的原因,套接字函数中(如connect,bind等)使用的参数类型大多是sockaddr类型的。而如今进行套接字编程的时候大都使用sockaddr_in进行套接字地址填充
sockaddr_in结构体介绍
struct sockaddr_in {
uint8_t sa_len; /* 结构体长度*/
short int sin_family; /* 通信类型 */
unsigned short int sin_port; /* 端口 */
struct in_addr sin_addr; /* Internet 地址 */
unsigned char sin_zero[8]; /* 未使用的*/
};
struct in_addr { //sin_addr的结构体类型in_addr 原型
unsigned long s_addr; /*存4字节的 IP 地址(使用网络字节顺序)。*/
};
因此,这就要求对这些函数进行调用的时候都必须要讲套接字地址结构指针进行类型强制转换,例如:
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返回给进程。
Linux Socket API Connect 函数详解相关推荐
- Linux socket下read函数详解
在socket中服务器与客户端进行通信,当其中一方调用close(即这一方会发送一个fin)关闭套接字之后,另一方read()会返回一个0. 服务器开两个进程,一个用于接收客户端发送的数据,另一个进程 ...
- linux socket编程 accept函数详解
int accept(int sockfd,struct sockaddr * addr,socklen_t * addrlen); sockfd的参数为listen()函数返回的监听套接字: add ...
- linux send与recv函数详解
linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...
- linux中recvfrom读取速度,Linux系统调用-- recv/recvfrom 函数详解
Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...
- linux内核 recvfrom,Linux系统调用-- recv/recvfrom 函数详解
Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...
- linux网络编程常用函数详解与实例(socket--bind--listen--accept)
常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...
- linux rcu 用法,synchronize_rcu()函数详解
二.代码详解 定义在:linux/kernel/rcupdate.c 606/** 607 * synchronize_rcu - wait until a grace period has elap ...
- openGL API glGetShaderInfoLog函数详解
glGetShaderInfoLog详解 官方文档 翻译 例子 代码分析 glGetShaderInfoLog输出错误 工程下载 官方文档 官网文档 Name glGetShaderInfoLog - ...
- 【Linux系列】signal函数详解
Date: 2023.1.18 文章目录 1.介绍 2.如何安装多个处理函数 3.信号列表 转载自:http://imhuchao.com/2300.html signal作用是为信号注册一个处理器. ...
最新文章
- 配置ANDROID_HOME
- C++11特性(模板类 initializer_list)
- mysql索引数据结构图解_深入理解Mysql索引底层数据结构与算法
- 从营销手段到商业新基建,“以旧换新”还有多少价值等待挖掘?
- Harbor管理docker镜像(1.7.5版本-主从复制)
- servle 3.0 新特性之一 对上传表单的支持
- Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法
- 双机通信c语言程序,上传一个自己编写的I2C双机通信程序
- Ubuntu环境使用conda安装轻量级中文ocr开源项目chineseocr_lite,最简单的方式
- 原理 msc_计算机网络原理梳理丨无线与移动网络
- 增强优化JavaScript性能的方法 - 技巧大全
- 为什么大公司都不用mfc和qt_百度竞价推广效果下降,为什么有的老板还是只愿意做百度推广?...
- web之JavaScript
- 字节跳动面试必问:kafkagroupid数目
- mysql断言命令_mysql的触发模拟断言
- minicap和minitouch安装
- 小游戏---html飞翔的小鸟
- stm32 OV7670摄像头模块的介绍以及应用(SCCB的使用)
- 2021SC@SDUSC 量子加密库libqs
- Java 二叉树完整代码(递归迭代)
热门文章
- obs可以推到中转服务器吗,能否使用OBS(Open Broadcaster Software)、FMLE(Flash Media Live Encoder)等第三方软件进行推流?...
- 为全局变量赋值_实例分析如何远离漫天飞舞的全局变量
- dataframe 选择输出_使用 Python 实现机器学习特征选择的 4 种方法
- 华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器
- abp vue如何配置服务地址_DHCP服务如何配置才能尽量减少被攻击的可能
- 信号延长器常见故障问题及解决方案汇总
- 【渝粤教育】国家开放大学2018年春季 0675-21T中级财务会计(2) 参考试题
- 【渝粤教育】广东开放大学 物业服务营销管理 形成性考核 (59)
- 【渝粤教育】广东开放大学 商法 形成性考核 (40)
- 【渝粤题库】陕西师范大学700005 遗传学