网络编程基本概念

      最后更新:2022-01-14 13:44:07 手机定位技术交流文章

      1.socket概念

      1.socket可以理解成插座,两个不同计算机中运行的程序,通过socket建立通道,在通道中进行数据传输来通信。

      2.socket隐藏了TCP/IP协议族的细节,我们只需要调用socket的函数就可以完成网络通信。

      3.socket提供基于TCP协议的流服务(stream)和基于UDP协议的数据报服务(datagram),流服务当下使用得最多,之后也只会学习这个。

      2.简单的socket通信流程

      在这里插入图片描述
      PS:
      1.socket通信采用的是客户/服务端的通信模式。
      2.监听模式可以理解为是一种"待机"的模式,服务端在等待着客户端建立连接。

      3.零散的相关知识

      这部分函数能修改的部分其实很少,我们下面学的是socket的通信过程还有函数、结构体的用途,不会去怎么了解本质的内容。

      1.文件描述符

      所有输入输出都是文件,socket()函数的返回值是一个文件描述符(整数),0是标准输入,1是标准输出,2是标准错误,还有其他的整数。

      2.sockaddr_in结构体

      这个是用来存储通信地址信息的结构体。

      3.服务端绑定自身通信地址

      一般服务器有多个网卡,对应多个IP,可以:
      指定一个具体IP来通信

      任意本机IP

      任意IP的方式用的比较多。

      4.服务端绑定自身端口/客户端指定服务端端口

      使用网络字节顺序(通常用这个)

      不使用网络字节顺序

      当然,客户端、服务端要保持统一,要么都使用网络字节顺序要么都不用

      5.客户端指定服务端IP地址

      这里方式和第二点不同,但是和第二点用的IP应该是同一个

      客户端这里,如果已知服务端IP地址的情况下,我们使用inet_addr()函数也没问题,但是通常客户端知道的只有域名而非地址,所以使用gethostbyname,这个函数无论是直接传地址还是传域名,都能帮我们解析并且转换成网络字节序的地址。

      6.服务端将通信地址和端口所在结构体绑到socket

      使用bind()函数,bind翻译即是绑定

      7.客户端一个socket,服务端两个socket

      客户端只有一个socket(),可以对应一个serverfd,用于通信。

      而服务端有两个socket(),一个对应listenfd,用于监听。另一对应clientfd,之后和客户端通信(无论是接收还是发送)都用这个。

      8.程序退出前关闭socket

      socket()得到的文件描述符也是系统资源,是有限的,程序退出前必须关闭socket.

      9.主机字节序

      多个字节的数据存放内存中有两种方法:一是从内存低地址开始存,另一是从内存高地址开始存,分别叫小端字节序和大端字节序。
      两种方式都分别有CPU来使用(采取哪种方式也只和CPU设计有关,与操作系统无关)。

      10.网络字节序

      这是TCP/IP协议中规定好的,采用大端字节序,保证不同的系统之间也能正确通信。

      11.网络字节序和主机字节序转换

      有四个函数htons()、ntohs()、htonl()、ntohl();
      h代表host主机,n代表network网络,to即是to,s代表short,l代表long
      htons和ntohs可以实现16位无符号数字节转换,
      htonl和ntohl可以实现32位无符号数字节转换。

      下面是从 C语言技术网 拿的一个最简单的客户端和服务端的通信程序,可以借鉴入门。

      服务端

      客户端

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/16476.html

          热门文章

          文章分类