我们首先来看一个最简单的TCP服务端、客户端的例子,服务端在端口8080等待连接,客户端发起连接,连接成功后发送“Hello,Server”,然后关闭连接;服务端接收客户端的消息并打印,然后关闭连接。
服务端代码:
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <cstring>
#include <iostream>
#include <string>
#define PORT 8080 // 要监听的端口号
#define MAX_CONN 5 // 最大并发连接数
int main() {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(struct sockaddr_in);
char buffer[1024];
// 创建一个套接字
if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Failed to create socket." << std::endl;
return -1;
}
// 设置地址结构
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定套接字到指定IP和端口
if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) <
0) {
std::cerr << "Failed to bind socket." << std::endl;
close(server_sock);
return -1;
}
// 开始监听连接请求
if (listen(server_sock, MAX_CONN) < 0) {
std::cerr << "Failed to listen on socket." << std::endl;
close(server_sock);
return -1;
}
std::cout << "Server is listening on port " << PORT << std::endl;
while (true) {
// 接受新的连接请求
if ((client_sock = accept(server_sock, (struct sockaddr*)&client_addr,
&addr_len)) < 0) {
std::cerr << "Failed to accept connection." << std::endl;
continue;
}
std::cout << "Accepted connection from: " << inet_ntoa(client_addr.sin_addr)
<< ":" << ntohs(client_addr.sin_port) << std::endl;
// 接收客户端发送的数据
ssize_t n = recv(client_sock, buffer, sizeof(buffer), 0);
if (n < 0) {
std::cerr << "Failed to receive data from client." << std::endl;
close(client_sock);
continue;
}
buffer[n] = '\0'; // 添加字符串结束符
std::cout << "Received message: " << buffer << std::endl;
// 关闭客户端连接
close(client_sock);
}
// 关闭服务器套接字
close(server_sock);
return 0;
}