socket编程
创始人
2024-11-18 21:35:26
0次

文章目录

  • 套接字
  • 网路字节序列
  • TCP和UDP套接字

本文章主要介绍Linux下套接字的相关接口,和一些基础知识。

套接字

所有网络通信的行为本质都是进程间进行通信,网络通信也是进程间通信,只不过是不同主机上的两个进程之间的通信。网络通信对于双方来说首先要先把数据到达对方的机器,然后在到达对应的进程。而套接字就是IP地址+端口号,IP地址可以确定互联网中唯一的一台主机,而端口号可以表示某个主机中进程的唯一性。所以IP+端口号就可以确定互联网中的唯一一个进程。

如何理解端口号(port)?
可以表示当前主机上唯一的一个进程,不采用pid的原因主要是为了把网络模块和进程模块进行解耦。port专门用来网络通信,一个端口号只能关联一个进程,而一个进程可以关联多个端口号。

网路字节序列

对于我们不同的主机,使用的存储方案是不同的,有的是大端机有的是小端机,所以网络为了保证网络传输的过程中,对方都能准确的把对方的数据拿到并正确读取,网路就规定所有到达的网络的数据必须是大端,因此所有从网络收的数据,都会是大端数据。
但是因为我们的机器可能是大端或者小端,我们需要通过网络传输数据是还需要自己进行转换,比较麻烦,所以系统用给了我们把主机序列转网络序列的接口,同样也提供了网络转主机的接口。
在这里插入图片描述
h 就是主机,n就是网络。

IP地址我们看到的是点分十进制的,但是在代码里面一个整型变量就可以存储。所以系统中还存在很多把IP地址的点分十进制和整型来回转化的函数。

在介绍这些函数之前先来了解一下网络中的几个结构体字段。
在这里插入图片描述
IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16位端口号和32位IP地址.
IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容.
socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;

sockaddr
在这里插入图片描述
sockaddr_in
在这里插入图片描述
in_addr
在这里插入图片描述
可以看到底层的in_addr_t就是一个整型变量。

IP地址的点分十进制和整型来回转化的函数
在这里插入图片描述
根据接口差不多就可以猜到谁转化谁了。
在这里插入图片描述这个函数是把字符串转整型的,src就是需要转化的,dst就是需要转化到哪里。af为网络类型,一般网络为AF_INET。

在这里插入图片描述
这个函数是把整型转字符串的,src就是需要转化的,dst就是需要转化到哪里。size为dst缓冲区的大小。af为网络类型,一般网络为AF_INET。

其中inet_pton和inet_ntop不仅可以转换IPv4的in_addr,还可以转换IPv6的in6_addr,因此函数接口是void
*addrptr。

TCP和UDP套接字

TCP为可靠通信,UDP为不可靠通信,这里的可靠不可靠是中性词,可靠表示更为复杂,通信是需要做更多的工作,而不可靠,说明更简单,适用对数据可靠性不高的场景。它们只有不同,没有好坏。

TCP和UDP通信一般为CS模式。一般情况下:
客户端不允许调用bind(), 没有必要调用bind()固定一个端口号. 否则如果在同一台机器上启动多个客户端, 就会出现端口号被占用导致不能正确建立连接;
服务器也不是必须调用bind(), 但如果服务器不调用bind(), 内核会自动给服务器分配监听端口, 每次启动服务器时端口号都不一样, 客户端要连接服务器就会遇到麻烦;
而服务器一般不绑定固定的IP,一般把服务器bind的IP设置为INADDR_ANY(0),表示绑定本机的任所有P地址。因为一台主机可能有多个IP地址,而只绑定一个,对于另一个IP的请求就收不到了,所以一般IP也不固定。

SOCK场景的API
在这里插入图片描述
TCP和UDP创建套接字是domain都为AF_INET,TCP的type为SOCK_STREAM,UDP的为SOCK_DGRAM,最后一个一般为0,因为前两个参数确定,第三个就可以确定了。
UDP读取一般使用recvfrom
在这里插入图片描述
TCP读取数据一般使用recv
在这里插入图片描述
UDP发送一般使用sendto
在这里插入图片描述
TCP发送一般使用send
在这里插入图片描述
创建UDP服务器一般为socket创建套接字,socket会返回一个类似文件描述符的东西,以后通信就需要依靠这个文件描述符了,然后进行bind服务器的端口和IP,然后就是进行数据的发送和读取了。
创建TCP服务器一般为socket创建套接字,然后进行bind,设置套接字的listen属性,然后进行accept进行监听,有连接到来就返回一个新的文件描述符和该请求服务的进程通信,监听套接字接着监听。所以它们大多数情况下都需要创建线程去处理连接,主线程监听连接。

相关内容

热门资讯

每日必看!江岸多玩到底能开挂吗... 每日必看!江岸多玩到底能开挂吗(辅助挂),江岸多玩原来真的有辅助挂讲义1、江岸多玩脚本辅助下载、江岸...
玩家交流!颖河竞技怎么开挂(外... 玩家交流!颖河竞技怎么开挂(外挂),颖河竞技好像是有外挂教材一、颖河竞技游戏安装教程牌型概率发牌机制...
最新通报!皮皮四川麻将软件下载... 最新通报!皮皮四川麻将软件下载(辅助挂),皮皮四川麻将果然有辅助挂模块1、操作简单,无需皮皮四川麻将...
一分钟揭秘!52游戏开挂脚本(... 一分钟揭秘!52游戏开挂脚本(透视挂),52游戏切实有透视挂法子52游戏脚本下载中分为三种模型:52...
一分钟快速了解!堆堆乐开挂破解... 一分钟快速了解!堆堆乐开挂破解(外挂),堆堆乐竟然真的有外挂方针1、下载好堆堆乐正确养号方法之后点击...
重大通报!汇城贵州麻将开挂脚本... 重大通报!汇城贵州麻将开挂脚本(开挂),汇城贵州麻将原来真的有开挂法门1、重大通报!汇城贵州麻将开挂...
盘点一款!七色城透视挂件(外挂... 盘点一款!七色城透视挂件(外挂),七色城切实是真的有外挂经验1、全新机制【七色城ai辅助工具激活码】...
今日头条!多多休闲透视软件下载... 今日头条!多多休闲透视软件下载(外挂),多多休闲确实是真的有外挂攻略1、首先打开多多休闲辅助器下载最...
关于!钱柜麻将真的有透视吗(辅... 关于!钱柜麻将真的有透视吗(辅助器),钱柜麻将一贯是有辅助器练习钱柜麻将能透视中分为三种模型:钱柜麻...
今日焦点!河北家乡棋牌辅助工具... 今日焦点!河北家乡棋牌辅助工具(外挂),河北家乡棋牌果然是有外挂手册小薇(辅助器软件下载)致您一封信...