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 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返回给进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 适用参数_Java功能的适用性

java 适用参数Java语言和标准库功能强大&#xff0c;但功能强大&#xff0c; 责任重大 。 一方面看到很多用户代码滥用或滥用稀有的Java功能&#xff0c;另一方面却完全忘记了大多数基本功能之后&#xff0c;我决定撰写此摘要。 这不是每个Java开发人员都应该探索&#xff0c;了…

linux查看tar进程进度,Linux:wget后台下载/查看后台任务进度

今天在自己的服务器上使用wget下载一个大文件时&#xff0c;不小心把ssh断开连接了&#xff0c;重新登上去后想查看这个文件的下载进度&#xff0c;现记录一些wget的知识点。1&#xff1a;后台下载使用wget -b url[root8f9fbda9bb48 ~]# wget -b http://cn.wordpress.org/word…

【redis】在windos下的redis服务器的搭建

1.下载Redis-x64-3.2.100&#xff08;楼主用的版本&#xff0c;需要安装包的可以找我要&#xff09; 下载官方版本 2.解压后在cmd下运行 redis-server redis.windos.conf 此时redis服务已经在该windows下6379端口运行 3.把该服务设置成windos服务 redis-server --service-insta…

《Linux网络接口》---------struct ifreq struct ifconf

网络接口--------------struct ifconf&#xff0c;struct ifreq 网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示&#xff1a; 接口 SIOCGIFCONF SIOCSIFADDR SIOCGIFADDR SIOCSIFBRDADDR SIOCGIFBRDADDR SIOCSIFNETMASK SIOCGIFNETMASK 获取所有接口…

会议季Mic Drop:您不应该错过的13场Java演讲

您的老板没有派您参加真正的会议吗&#xff1f; 我们为您准备了最好的讲座 9月主要发生在一些重大事件上&#xff1a;秋季的第一天&#xff0c;甚至全国熏肉日。 这也是召开会议最忙的月份之一&#xff0c;一些大型Java事件涵盖了平台的新的重要更新。 在下面的帖子中&#x…

linux7设备的挂载,centos7磁盘分区与挂载解析

Linux系统在磁盘、U盘以及光盘等设备分区和挂载操做才能使用。centos1、磁盘分区原理与规则ui磁盘分区类型&#xff1a;主分区&#xff0c;扩展分区&#xff0c;逻辑分区this分区规则&#xff1a;centos7一、主分区扩展分区的数量不能超过4个&#xff0c;且扩展分区只能有1个。…

【公众号系列】SAP的新零售

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【公众号系列】SAP的新零售写在前面 还是以前的一篇文章&#xff08;一八年三月&#xff09;&#xff0c;拿出来重新了解一下。 随着…

linux下汇编语言开发总结

汇编语言是直接对应系统指令集的低级语言&#xff0c;在语言越来越抽象的今天&#xff0c;汇编语言并不像高级语言那样使用广泛&#xff0c;仅仅在驱动程序&#xff0c;嵌入式系统等对性能要求苛刻的领域才能见到它们的身影。但是这并不表示汇编语言就已经没有用武之地了&#…

使用openocd调试Linux内核,openocd安装与调试

环境&#xff1a;硬件&#xff1a;PC机ARM仿真器v8.00已下载好bit流的Xinlinx SoC开发板(其上有arm cortex-a9核)软件&#xff1a;Redhat Linux6(或虚拟机) openocd使用openocd下载程序&#xff0c;调试arm cortex-a9核。一、openocd安装下载libusb库安装或直接yum install li…

execl中设置的格式无法实现

在一次项目中&#xff0c;需要导出execl表&#xff0c;并且要给表中的表格设置格式&#xff0c;因为每列的格式都不一样&#xff0c;需要单独设置设置这些格式&#xff0c;在后期使用中因为导入的数据过多&#xff0c;是的后面的单元格中设置的格式无法实现。 每次打开execl表格…

loadrunner监控linux性能指标,使用LoadRunner监控Linux系统性能.doc

使用LoadRunner监控Linux系统性能性能监控案例■秘密 □机密 □绝密PAGELinux系统性能监控案例(仅供内部使用)版 本 号&#xff1a;V0.1保 密 等 级&#xff1a;■秘密 □机密 □绝密编 制&#xff1a;XXX审 核&#xff1a;修订记录日期版本号描述作者2011-06-130.1初稿完成目录…

github gists_Eclipse中的Github Gists

github gists我想描述有关在Eclipse中集成GitHub Gists的简单步骤。 有几个来源促使我这样做&#xff1a; Eclipse的GitHub Mylyn连接器 EGit / GitHub /用户指南 http://eclipse.github.com 我一直在使用Eclipse Java EE发行版&#xff0c;其中已经安装了Mylyn插件&#…

分析.cpp文件编译生成的汇编文件里语句的作用

1234int main(int argc,char** argv){return 1;}1g -S test.cpp生成test.s汇编文件 .file"null-test.cpp".text.globl main.type main, functionmain:.LFB0:.cfi_startproc pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa…

vue-cli3.0使用及配置(部分)

好长一段时间没有关注vue脚手架了&#xff0c;昨天因为需要个后台模板&#xff0c;用脚手架 搞了一下&#xff0c;竟然发现指令不能用了&#xff0c;看官方文档已经升级3.0&#xff0c;也是试的玩了一下&#xff0c; 大致写写怎么玩的&#xff01;12341.先全局安装vue-cli3.0 …

centos arm-linux-gcc,CentOS 6.4配置arm-linux-gcc交叉环境

首先解压arm-linux-gcc到制定文件夹[armacer ~]$ sudo tar xvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /opt/tool/配置环境变量&#xff1a;[armacer ~]$ sudo vi /etc/profile添加:PATH/opt/tool/gcc-3.4.5-glibc-2.3.6/bin:$PATHexport PATH保存退出。执行[armacer ~]$…

使用JavaSymbolSolver解决Java代码中的方法调用

为什么创建java-symbol-solver&#xff1f; 几年前&#xff0c;我开始使用JavaParser &#xff0c;然后开始做出贡献。 不久之后&#xff0c;我意识到我们想对Java代码执行的许多操作不能仅通过使用解析器生成的抽象语法树来完成&#xff0c;我们还需要解析类型&#xff0c;符号…

kali2.0安装搜狗输入法

其实方法应该是是通用的 &#xff08;一开始源要配置好&#xff1a; 修改软件源APT-sources.list [python] view plaincopy vim /etc/apt/sources.list 将原来的注释掉&#xff0c;加了个阿里的#阿里云kali源deb http://mirrors.aliyun.com/kali sana main non-free contrib…

linux+vim+动不了,linux的vim按了ctrl+s之后假死的解决办法

Aqua Data Studio中文乱码使用Aqua Data Studio 查询数据时,如果表中的数据有中文时,会显示乱码,如下图: 解决方法很简单,只能更改字体即可,步骤如下: 更改字体后,显示的结果如下:C&num;调用脚本语言(三)-- IronJS 与 IronLua 简单方法性能比较1. 测试环境 1.1. 硬件环境…

aix linux操作系统,AIX--操作系统安装(AIX 6.1)

前一段时间&#xff0c;胡哥我接到老板的任务&#xff0c;要在AIX系统上安装zabbix agent呀。可是胡哥只是玩过linux对于AIX这种需要硬件支持的才能玩的高端玩意可是从来没接触过呀&#xff0c;虽说linux是类unix&#xff0c;可是与unix系统还是有区别。有啥办法了&#xff0c;…

秋季学习总结

经过这个学期的学习让我对软件工程这个专业有了新的认识&#xff0c;从c语言的学习中&#xff0c;让我慢慢懂得了如何去编写一个程序&#xff0c;但是编写一个程序也并不是那么的容易。在这个学期的学期中我总是感觉容易忘记上一节课所讲的东西&#xff0c;这个是课后自己没花时…