文章目录
-
-
-
- [1. 什么是Socket?](#1. 什么是Socket?)
- [2. Socket编程模型](#2. Socket编程模型)
-
-
1. 什么是Socket?
Socket是一个双向的通信端点。它允许一台计算机的程序与另一台计算机的程序进行数据传输。Socket根据网络协议可以分为不同类型,但最常用的两种是:
- TCP (传输控制协议):提供可靠的、面向连接的通信服务。TCP连接像一个虚拟的电路,两端通过Socket进行数据传输,确保数据包按顺序到达。
- UDP (用户数据报协议):提供无连接、尽力而为的通信服务。与TCP不同,UDP没有建立连接过程,数据包可能会丢失或乱序,但它更快,适合对时延敏感的应用场景。
2. Socket编程模型
在实际编程中,创建Socket的过程可以划分为几个步骤:
-
创建Socket :
首先,服务器和客户端都需要调用系统提供的API创建一个Socket。这个Socket类似于电话线两端的插头。
cppint socket_fd = socket(AF_INET, SOCK_STREAM, 0);
AF_INET
表示使用IPv4地址。SOCK_STREAM
表示使用TCP协议。如果要使用UDP,则使用SOCK_DGRAM
。
-
绑定地址(仅服务器端) :
服务器端需要将创建的Socket绑定到一个特定的地址(IP地址+端口号),以便客户端能够访问它。
cppsockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); server_addr.sin_addr.s_addr = INADDR_ANY; bind(socket_fd, (sockaddr*)&server_addr, sizeof(server_addr));
-
监听连接(仅服务器端) :
服务器需要监听客户端的连接请求,指定可以同时处理的最大连接数。
cpplisten(socket_fd, 10);
-
接受连接(仅服务器端) :
当有客户端请求连接时,服务器会接受这个连接并创建一个新的Socket与客户端进行通信。
cppint client_fd = accept(socket_fd, nullptr, nullptr);
-
连接服务器(客户端) :
客户端通过Socket向服务器发起连接请求。
cppsockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); connect(socket_fd, (sockaddr*)&server_addr, sizeof(server_addr));
-
发送和接收数据 :
一旦建立了连接,服务器和客户端可以通过
send()
和recv()
函数进行数据传输。cpp// 发送数据 const char* msg = "Hello, Server!"; send(socket_fd, msg, strlen(msg), 0); // 接收数据 char buffer[1024]; int bytes_received = recv(socket_fd, buffer, sizeof(buffer), 0);
-
关闭连接 :
通信结束后,需要关闭Socket释放资源。
cppclose(socket_fd);