C++利用socket技术建立网络连接
1. socket技术简介
计算机通信领域,socket被翻译为“套接字”,它是计算机之间进行通信的一种约定,或一种方式。通过socket这种约定,计算机之间可以建立连接,并传输数据。
socket技术起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open ->读写write/read->关闭close”模式来操作。
2. 网络中进程如何通信
我理解的通讯是要解决2个问题:
- 我要怎么找到上家地址(找到接收信息的电脑);
- 通过地址我怎么找到上家派来和我接头的人(接收信息的电脑中具体哪一个程序是用来。)
所有的通讯都要确定以上两个问题,否则会出现要么不知道找哪一台电脑,要么找到电脑了也不知道哪个程序来响应传输过来的数据。
所以计算机建立了一套规则来确定,这个规则就是网络协议。当然规则有很多种,其中TCP/IP协议簇就是一种现在被广泛应用的协议,而所谓的socket技术就是将这种协议封装起来,方便大家调用。
TCP/IP协议簇首先利用网络层的“IP地址”确定网络中的主机,再依靠传输层的“协议+端口”标识主机中的应用程序,解决上面的两个问题。
上面的所说的“协议+端口”中的协议有两种,一种是TCP协议,另一种是UDP协议,这两种协议针对的需求不同,TCP协议是一种可靠的网络传输协议,它需要经过3次握手和4次挥手的方式保证传输的数据被正确的接收到,但是由于需要进行多次确认,牺牲了一定的网络资源,导致传输效率下降(当然也不是慢的跟狗一样,这个慢只是相对于UDP)。而UDP协议则不保证数据传输被接收到,发送方的数据有可能会在传输中丢失,但是这种方式保证了传输速度,在一些要求速度而对数据完整性要求不高的场景(如视频播放,掉几个帧不妨碍观看效果)中得到广泛应用。
3. socket技术在C++中的编写方式
上图描述了套接字技术中基于TCP协议的一种实现方式。它把计算机分为两个实体,一个为服务端,一个为客户端,服务端将程序绑定到电脑的IP地址和端口上,然后客户端通过监听套接字向服务端的地址和端口发送链接请求,握手通过后,双方连接建立完成,此时双方通过传输套接字传输数据,当数据传输结束后,使用close()函数断开链接。
在C++网络编程中,为了引用上面套接字的相关应用,需要引入一些头文件和库文件,并对系统进行初始化,以及释放空间的扫尾工作,这将在后面的代码中有一定的展示。
TCP协议服务端
TCP协议的服务端一般需要6步来实现:
- 加载套接字头文件、初始化环境平台
- 创建监听套接字
- 将监听套接字绑定到IP地址和端口上
- 监听端口
- 接受客户端请求
- 发送、接收消息
- 关闭套接字
- 清理环境
这里需要注意的是,监听套接字与传输用的套接字不是一个,关闭的时候是关闭监听套接字。
代码实现
#include<WinSock2.h>//套接字头文件
#include<iostream>
using namespace std;
//制定动态度的lib文件
#pragma comment(lib,"ws2_32.lib")//套接字函数库
int main()
{
//初始化winsock2.2相关动态库
WSADATA wd;
if(WSAStartup(MAKEWORD(2, 2), &wd) != 0)//0表示成功
{
cout << "WSAStartup error:" << WSAGetLastError();
return 0;
}
//1.创建TCP socket
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
cout << "soc