我按照教程(该部分底部附近的大代码块) 位置:http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select 主服务器代码如下:
while (true)
{
read_fds = master;
if (select(fd_max + 1, &read_fds, NULL, NULL, NULL) == -1)
{
cerr << "ERROR. Select failed" << endl;
return -1;
}
for (int i = 0; i <= fd_max; i++)
{
if (FD_ISSET(i, &read_fds))
{
if (i == welcome_socket)
{
cout << "NEW CONNECTION" << endl;
client_len = sizeof(struct sockaddr_in);
client_sock = accept(welcome_socket, (struct sockaddr *) &client_addr, &client_len);
if (client_sock != -1)
{
FD_SET(client_sock, &master);
if (client_sock > fd_max)
{
fd_max = client_sock;
}
}
}
else
{
int length, total_read = 0;
// CONNECTION CLOSED BY CLIENT
if (safe_recv(client_sock, &length, sizeof(int)) <= 0)
{
cout << "CONNECTION CLOSED" << endl;
close(i);
FD_CLR(i, &master);
}
else
{
char *message = (char *)memset((char *)malloc(length + 1), 0, length);
// while ((total_read += safe_recv(client_sock, message + total_read, length - total_read)) < length) {}
safe_recv(client_sock, message, length);
// RESPOND WITH MESSAGE
cout << "MESSAGE: " << message << endl;
write(client_sock, process(message), length);
free(message);
}
}
}
}
}
我正在做的是首先(从客户端)发送字符串的长度,然后是字符串本身。然后服务器发回process(message)
。
当我只有1个连接时,我看到了正确的行为。但是,如果已连接1并连接新客户端,我所看到的是:
CONNECTION CLOSED
)我试图将其与教程代码非常相似。我已经运行了教程服务器,并且可以按照预期的方式运行多个客户端。 我是网络编程的新手,所以如果这是一个初学者问题或者我忽略了一些愚蠢的事情,我会道歉。
答案 0 :(得分:1)
代码仅从client_sock
读取和写入,client_sock
将替换为代码的接受处理部分中的新套接字。
您很可能希望与i
而不是client_sock
进行互动。