Linux C++网络通信:从基础套接字到实战示例 在Linux环境下用C++搞网络通信,套接字(socket)编程是绕不开的基石。简单来说,它就像是给不同计算机上的进程开了条“专用电话线”,让它们能通过互联网或局域网顺畅地交换数据。下面,我们就通过一个经典的TCP/IP通信实例,把服务器端和客户端
在Linux环境下用C++搞网络通信,套接字(socket)编程是绕不开的基石。简单来说,它就像是给不同计算机上的进程开了条“专用电话线”,让它们能通过互联网或局域网顺畅地交换数据。下面,我们就通过一个经典的TCP/IP通信实例,把服务器端和客户端的搭建过程完整走一遍。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
服务器端的角色,好比一个守候在固定地址的接待员。它的核心任务就四步:创建套接字、绑定地址、监听连接、处理请求。来看具体实现:
#include
#include
#include
#include
#include
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char* hello = "Hello from server";
// 创建socket文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置socket选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
// 绑定socket到本地地址和端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接受连接
if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 读取客户端发送的数据
read(new_socket, buffer, 1024);
std::cout << "Message from client: " << buffer << std::endl;
// 向客户端发送数据
send(new_socket, hello, strlen(hello), 0);
std::cout << "Hello message sent\n";
// 关闭套接字
close(new_socket);
close(server_fd);
return 0;
}
客户端则扮演主动呼叫者的角色。流程相对直接:创建套接字、指定服务器地址、发起连接、然后开始对话。代码如下:
#include
#include
#include
#include
#include
int main() {
struct sockaddr_in serv_addr;
int sock = 0;
const char* hello = "Hello from client";
char buffer[1024] = {0};
// 创建socket文件描述符
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cout << " Socket creation error ";
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
// 将IPv4地址从文本转换为二进制形式
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
std::cout << "Invalid address/ Address not supported ";
return -1;
}
// 连接到服务器
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
std::cout << "Connection Failed ";
return -1;
}
// 向服务器发送数据
send(sock, hello, strlen(hello), 0);
std::cout << "Hello message sent\n";
// 读取服务器发送的数据
read(sock, buffer, 1024);
std::cout << "Message from server: " << buffer << std::endl;
// 关闭套接字
close(sock);
return 0;
}
简单梳理一下这个例子的工作流程:服务器在8080端口进入监听状态,静静等待。客户端则主动向本机(127.0.0.1)的8080端口发起连接。握手成功后,客户端率先发送问候,服务器收到后打印消息并回复,一次完整的“握手-对话-告别”流程就此完成。
想要运行起来?编译环节很简单,使用g++分别处理即可:
g++ -o server server.cpp
g++ -o client client.cpp
接着,先启动服务器,再运行客户端,就能看到通信效果:
./server
./client
当然,这只是一个最基础的模型,相当于网络编程的“Hello World”。真实的项目环境要复杂得多:你得考虑各种网络异常和错误处理,可能还需要引入多线程或多进程来应对海量并发连接。如果项目规模继续扩大,像Boost.Asio、libevent或libuv这些专门的高性能网络库,就该成为你的得力工具了。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述