携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
socket网络通信中的一些小知识之一
socket网络通信在C++中是一块比较重要的知识内容,它上可引申至RPC、HTTP,下可追溯到OSI七层网络模型。C语言并没有在Windows和Linux这两套操作系统上提供一套统一的标准库,所以在Windows上和Linux上的编程方式也是不一样的。由于现在服务端大多采用Linux系统,所以本文也着重介绍在Linux上的socket网络编程。在Linux上的socket网络编程中,server端主要分为以下这么几个步骤。
第一步
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
新建一个socket连接,其实就是创建一个文件描述符,即fd(file description)。在Linux系统里,“一切皆文件”,这也就意味着,所有的I/O其实本质上都是对文件的读写,socket也不例外。AF_INET代表socket使用的协议簇的是IPv4,除了IPv4外,还支持AF_INET6也就是IPv6,以及本地的AF_UNIX也就是本地Unix套接字。现在世界范围内可分配的IPv4已经耗尽,越来越多的公司开始将自己的基础设施向IPv6进行迁移。我们在内网,仍然可以基于IPv4进行通信,是由于NAT的存在,使得一个局域网内在接入广域网时,只需要一个唯一的外部IPv4地址。SOCK_STREAM代表着底层使用流式、面向连接的套接字进行通信,而SOCK_DGRAM则代表使用数据报、面向无连接的套接字进行通信。SOCK_STREAM可以简单理解为TCP协议,SOCK_DGRAM则是UDP协议。这两种协议的区别放到以后的文章再去进行具体讨论,这里只说一下他们的具体适宜场景。TCP适合用于对于数据完整性、传输稳定性比较敏感的场合,而UDP则适用于要求极致速度的场景,最典型的,我们天天访问的网站所使用的的HTTP协议,就是基于TCP协议实现的,而DNS则是基于UDP来实现的。