Socket服务器是一种基于TCP/IP协议的网络通信方式,允许服务器与客户端之间进行双向数据传输。在C++和Linux环境下,Socket服务器通常使用POSIX标准的socket API来实现。
在第二次通过后,Socket服务器出现无限循环的问题。
以下是一个简单的C++ Socket服务器示例,展示了如何正确处理客户端连接并避免无限循环:
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAX_CLIENTS 10
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
// 创建Socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 绑定Socket
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
while (true) {
std::cout << "Waiting for connections..." << std::endl;
// 接受新连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
continue;
}
std::cout << "Connection accepted" << std::endl;
// 读取数据
read(new_socket, buffer, 1024);
std::cout << "Received message: " << buffer << std::endl;
// 发送响应
send(new_socket, "Hello from server", 17, 0);
std::cout << "Response sent" << std::endl;
// 关闭Socket
close(new_socket);
std::cout << "Socket closed" << std::endl;
}
// 关闭服务器Socket
close(server_fd);
return 0;
}
close(new_socket)
关闭客户端Socket。while (true)
循环中,每次处理完一个客户端连接后,能够继续等待新的连接。通过以上方法,可以有效避免Socket服务器在第二次通过后出现无限循环的问题。
领取专属 10元无门槛券
手把手带您无忧上云