最后更新:2022-01-14 13:44:07 手机定位技术交流文章
1.socket可以理解成插座,两个不同计算机中运行的程序,通过socket建立通道,在通道中进行数据传输来通信。
2.socket隐藏了TCP/IP协议族的细节,我们只需要调用socket的函数就可以完成网络通信。
3.socket提供基于TCP协议的流服务(stream)和基于UDP协议的数据报服务(datagram),流服务当下使用得最多,之后也只会学习这个。
PS:
1.socket通信采用的是客户/服务端的通信模式。
2.监听模式可以理解为是一种"待机"的模式,服务端在等待着客户端建立连接。
这部分函数能修改的部分其实很少,我们下面学的是socket的通信过程还有函数、结构体的用途,不会去怎么了解本质的内容。
所有输入输出都是文件,socket()函数的返回值是一个文件描述符(整数),0是标准输入,1是标准输出,2是标准错误,还有其他的整数。
这个是用来存储通信地址信息的结构体。
一般服务器有多个网卡,对应多个IP,可以:
指定一个具体IP来通信
任意本机IP
任意IP的方式用的比较多。
使用网络字节顺序(通常用这个)
不使用网络字节顺序
当然,客户端、服务端要保持统一,要么都使用网络字节顺序要么都不用
这里方式和第二点不同,但是和第二点用的IP应该是同一个
客户端这里,如果已知服务端IP地址的情况下,我们使用inet_addr()函数也没问题,但是通常客户端知道的只有域名而非地址,所以使用gethostbyname,这个函数无论是直接传地址还是传域名,都能帮我们解析并且转换成网络字节序的地址。
使用bind()函数,bind翻译即是绑定
客户端只有一个socket(),可以对应一个serverfd,用于通信。
而服务端有两个socket(),一个对应listenfd,用于监听。另一对应clientfd,之后和客户端通信(无论是接收还是发送)都用这个。
socket()得到的文件描述符也是系统资源,是有限的,程序退出前必须关闭socket.
多个字节的数据存放内存中有两种方法:一是从内存低地址开始存,另一是从内存高地址开始存,分别叫小端字节序和大端字节序。
两种方式都分别有CPU来使用(采取哪种方式也只和CPU设计有关,与操作系统无关)。
这是TCP/IP协议中规定好的,采用大端字节序,保证不同的系统之间也能正确通信。
有四个函数htons()、ntohs()、htonl()、ntohl();
h代表host主机,n代表network网络,to即是to,s代表short,l代表long
htons和ntohs可以实现16位无符号数字节转换,
htonl和ntohl可以实现32位无符号数字节转换。
下面是从 C语言技术网 拿的一个最简单的客户端和服务端的通信程序,可以借鉴入门。
本文由 在线网速测试 整理编辑,转载请注明出处。