在Linux环境下使用C++进行网络通信,通常会使用套接字(socket)编程。以下是一些基本步骤和示例代码,用于创建一个简单的TCP客户端和服务器。
首先,你需要包含必要的头文件并创建一个套接字。
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
int main() {
// 创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
std::cerr << "Could not create socket" << std::endl;
return -1;
}
// ...
}
服务器需要绑定一个地址和端口来监听客户端的连接请求。
// 服务器地址结构
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口
server_address.sin_port = htons(8080); // 端口号
// 绑定套接字到地址
if (bind(sock, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
std::cerr << "Bind failed" << std::endl;
close(sock);
return -1;
}
服务器需要监听传入的连接请求。
// 监听套接字
if (listen(sock, 3) < 0) {
std::cerr << "Listen failed" << std::endl;
close(sock);
return -1;
}
服务器接受一个传入的连接。
// 接受连接
struct sockaddr_in client_address;
socklen_t client_address_size = sizeof(client_address);
int client_sock = accept(sock, (struct sockaddr*)&client_address, &client_address_size);
if (client_sock < 0) {
std::cerr << "Accept failed" << std::endl;
close(sock);
return -1;
}
客户端需要连接到服务器的地址和端口。
// 客户端地址结构
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr); // 服务器IP地址
server_address.sin_port = htons(8080); // 服务器端口号
// 连接到服务器
if (connect(sock, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
std::cerr << "Connect failed" << std::endl;
close(sock);
return -1;
}
一旦连接建立,就可以发送和接收数据了。
// 发送数据
const char* message = "Hello, Server!";
send(client_sock, message, strlen(message), 0);
// 接收数据
char buffer[1024];
ssize_t bytes_received = recv(client_sock, buffer, sizeof(buffer) - 1, 0);
if (bytes_received > 0) {
buffer[bytes_received] = '\0'; // 确保字符串以null结尾
std::cout << "Received: " << buffer << std::endl;
}
通信结束后,应该关闭套接字。
// 关闭套接字
close(client_sock);
close(sock);
这是一个非常基础的网络通信示例。在实际应用中,你可能需要处理更多的错误情况,实现更复杂的协议,以及考虑多线程或异步IO来提高性能。此外,对于更高级的网络编程,你可能会使用像Boost.Asio这样的库,它提供了更高级的抽象和更易于使用的接口。