发布于2026-07-07 阅读(0)
扫一扫,手机访问
在Ubuntu下用C++搞网络编程,其实没有想象中那么复杂。核心就是搞懂套接字(sockets)、IP地址、端口号这几个基本概念,然后一步步搭起一个简单的通信框架。下面直接上干货,从环境准备到实战代码,一步步带你走通。

Ubuntu系统自带的g++编译器已经足够处理标准网络编程接口,基本不需要额外安装依赖。不过为了确保编译环境完整,还是建议先更新一下包管理器,并安装build-essential工具包——它会把常用的编译工具一次性配齐。
sudo apt-get update
sudo apt-get install build-essential
下面直接给出一套经典的TCP通信示例,包括服务器端和客户端。代码中的注释已经足够清晰,关键步骤都标出来了。
#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};
// 创建套接字文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置套接字选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
// 绑定套接字到地址和端口
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 from server", 18, 0);
std::cout << "Hello message sent\n";
// 关闭套接字
close(new_socket);
close(server_fd);
return 0;
}
#include
#include
#include
#include
#include
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[1024] = {0};
// 创建套接字文件描述符
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 from client", 18, 0);
std::cout << "Hello message sent\n";
// 读取响应
read(sock, buffer, 1024);
std::cout << "Message from server: " << buffer << std::endl;
// 关闭套接字
close(sock);
return 0;
}
编译过程很简单,直接用g++分别编译服务器和客户端源文件,生成两个可执行文件:
g++ -o server server.cpp
g++ -o client client.cpp
先在一个终端启动服务器:
./server
然后在另一个终端运行客户端:
./client
不出意外的话,你会看到服务器端打印出客户端的消息,客户端也收到了服务器的回应。一个最基础的TCP通信就这样跑通了。
实际项目里,单是跑通一个连接远远不够。你需要考虑多线程处理多个客户端、更完善的错误处理、数据序列化与反序列化等等。调试方面,gdb是Linux下最常用的工具;性能分析则可以用gprof定位热点代码。这些工具都能帮你把代码从“能跑”打磨到“稳健”。
说到底,网络编程的入门门槛并不高,关键是把socket生命周期、地址结构、错误处理这些基础吃透。上面的例子就是一套标准模板,理解了它,后续无论是扩展成HTTP服务器还是自定义协议,都只是在这个框架上做加法。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8