C++ TCP网络编程详细讲解
简介
TCP网络编程是指基于传输控制协议(TCP)实现的网络通信,其主要特点是数据传输稳定可靠,适用于对数据传输要求较高的应用场景。在C++中,我们可以使用一些网络编程库(如Boost.Asio、Winsock等)来实现TCP网络编程。
步骤
1. 创建socket
在进行TCP网络编程时,我们需要先创建一个socket,通过该socket来进行数据传输。在C++中,我们可以使用以下代码来创建一个socket:
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET) {
// 创建socket失败
return;
}
其中,AF_INET
表示使用IPv4协议,SOCK_STREAM
表示创建流式socket(即TCP),IPPROTO_TCP
表示使用TCP协议。
2. 绑定IP地址和端口号
在进行TCP网络编程时,我们需要将socket与一个本地IP地址和端口号进行绑定。如果是服务端程序,通常我们可以指定监听IP地址为0.0.0.0,表示监听所有可用的网络接口;如果是客户端程序,则可以将IP地址置为空字符串。
sockaddr_in addr = {0};
addr.sin_family = AF_INET; // 使用IPv4协议
addr.sin_port = htons(8080); // 绑定的端口号
addr.sin_addr.s_addr = INADDR_ANY; // 使用任意可用的IP地址
bind(sock, (sockaddr*)&addr, sizeof(addr));
3. 连接远程服务器
在进行TCP网络编程时,客户端需要先与服务器进行连接,才能发送和接收数据。我们可以使用以下代码使客户端与远程服务器进行连接:
sockaddr_in addr = {0};
addr.sin_family = AF_INET; // 使用IPv4协议
addr.sin_port = htons(8080); // 远程服务器端口号
inet_pton(AF_INET, "192.168.0.1", &addr.sin_addr); // 远程服务器IP地址
connect(sock, (sockaddr*)&addr, sizeof(addr));
4. 监听连接
在进行TCP网络编程时,服务端需要监听客户端的连接请求,我们可以使用以下代码使服务端开始监听:
listen(sock, SOMAXCONN); // 最大连接数
SOMAXCONN表示同时连接到服务端的最大客户端数量。
5. 接受连接
在进行TCP网络编程时,服务端需要接受客户端的连接请求,并创建一个新的socket与该客户端通信。我们可以使用以下代码接受连接请求:
sockaddr_in client_addr = {0};
int client_addr_len = sizeof(client_addr);
SOCKET client_sock = accept(sock, (sockaddr*)&client_addr, &client_addr_len);
6. 发送和接收数据
在进行TCP网络编程时,我们可以使用send
函数向对端发送数据,使用recv
函数从对端接收数据。以下代码展示了如何从服务端接收客户端发送的数据:
int recv_len = recv(client_sock, buf, buf_len, 0);
if(recv_len == SOCKET_ERROR) {
// 接收数据失败
return;
}
以下代码展示了如何向客户端发送数据:
// 假设待发送的数据存储在buf中
int send_len = send(client_sock, buf, buf_len, 0);
if(send_len == SOCKET_ERROR) {
// 发送数据失败
return;
}
示例
示例一:服务端
以下代码展示了如何创建一个服务端程序,该程序监听8080端口,等待客户端连接并接收客户端发送的数据:
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main() {
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
cout << "WSAStartup failed." << endl;
return 0;
}
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET) {
cout << "socket failed." << endl;
return 0;
}
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
if(bind(sock, (sockaddr*)&addr, sizeof(addr)) != 0) {
cout << "bind failed." << endl;
return 0;
}
listen(sock, SOMAXCONN);
sockaddr_in client_addr = { 0 };
int client_addr_len = sizeof(client_addr);
SOCKET client_sock = accept(sock, (sockaddr*)&client_addr, &client_addr_len);
if(client_sock == INVALID_SOCKET) {
cout << "accept failed." << endl;
return 0;
}
char buf[1024] = { 0 };
int recv_len = recv(client_sock, buf, sizeof(buf), 0);
if(recv_len == SOCKET_ERROR) {
cout << "recv failed." << endl;
return 0;
}
cout << "Received data: " << buf << endl;
closesocket(client_sock);
closesocket(sock);
WSACleanup();
return 0;
}
示例二:客户端
以下代码展示了如何创建一个客户端程序,该程序连接到服务端IP为192.168.0.1,端口号为8080,并向服务端发送数据"Hello, World!":
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main() {
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
cout << "WSAStartup failed." << endl;
return 0;
}
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET) {
cout << "socket failed." << endl;
return 0;
}
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "192.168.0.1", &addr.sin_addr);
if(connect(sock, (sockaddr*)&addr, sizeof(addr)) != 0) {
cout << "connect failed." << endl;
return 0;
}
const char* buf = "Hello, World!";
int buf_len = strlen(buf);
int send_len = send(sock, buf, buf_len, 0);
if(send_len == SOCKET_ERROR) {
cout << "send failed." << endl;
return 0;
}
closesocket(sock);
WSACleanup();
return 0;
}
总结
本文介绍了C++ TCP网络编程的基本步骤,包括创建socket、绑定IP地址和端口号、连接远程服务器、监听连接、接受连接、发送和接收数据等。同时,本文提供了两条示例,帮助读者更好地理解TCP网络编程的实现细节。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ TCP网络编程详细讲解 - Python技术站