微信公众号免费模板网站,电脑网站拦截怎么解除,网站开发模型工具,贞丰县住房和城乡建设局网站文章目录 套接字网路字节序列TCP和UDP套接字 本文章主要介绍Linux下套接字的相关接口#xff0c;和一些基础知识。
套接字
所有网络通信的行为本质都是进程间进行通信#xff0c;网络通信也是进程间通信#xff0c;只不过是不同主机上的两个进程之间的通信。网络通信对于双… 文章目录 套接字网路字节序列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_INETTCP的type为SOCK_STREAMUDP的为SOCK_DGRAM最后一个一般为0因为前两个参数确定第三个就可以确定了。 UDP读取一般使用recvfrom TCP读取数据一般使用recv UDP发送一般使用sendto TCP发送一般使用send 创建UDP服务器一般为socket创建套接字socket会返回一个类似文件描述符的东西以后通信就需要依靠这个文件描述符了然后进行bind服务器的端口和IP然后就是进行数据的发送和读取了。 创建TCP服务器一般为socket创建套接字然后进行bind设置套接字的listen属性然后进行accept进行监听有连接到来就返回一个新的文件描述符和该请求服务的进程通信监听套接字接着监听。所以它们大多数情况下都需要创建线程去处理连接主线程监听连接。