下面给你一个Linux 下 C++ 使用 socket 的最小可运行示例,覆盖 TCP 服务端 / 客户端,并解释每一步在做什么。
socket() 创建 socketbind() 绑定 IP + 端口listen() 监听accept() 等待客户端连接recv() / send() 收发数据close() 关闭socket()connect()send() / recv()close()// server.cpp
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("socket");
return 1;
}
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(server_fd, (sockaddr*)&addr, sizeof(addr)) < 0) {
perror("bind");
return 1;
}
if (listen(server_fd, 5) < 0) {
perror("listen");
return 1;
}
std::cout << "Server listening on port 8080..." << std::endl;
int client_fd = accept(server_fd, nullptr, nullptr);
if (client_fd < 0) {
perror("accept");
return 1;
}
char buf[1024];
ssize_t n = recv(client_fd, buf, sizeof(buf) - 1, 0);
if (n > 0) {
buf[n] = '\0';
std::cout << "Client: " << buf << std::endl;
send(client_fd, "Hello from server", 18, 0);
}
close(client_fd);
close(server_fd);
return 0;
}
// client.cpp
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return 1;
}
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) {
perror("connect");
return 1;
}
send(sock, "Hello server", 12, 0);
char buf[1024];
ssize_t n = recv(sock, buf, sizeof(buf) - 1, 0);
if (n > 0) {
buf[n] = '\0';
std::cout << "Server: " << buf << std::endl;
}
close(sock);
return 0;
}
g++ server.cpp -o server
g++ client.cpp -o client
./server &
./client
✅ 头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
✅ 端口要用 htons()
✅ recv 可能返回 0(断开)或 -1(错误)
✅ TCP 是流式协议,需要自己处理粘包
fork / pthread / epollselect / epoll如果你告诉我:
我可以直接给你更合适的代码。