【发布时间】:2017-05-16 22:34:59
【问题描述】:
我正在学习教程(该部分底部附近的大代码块) 这里: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两次)
我试图保持与教程代码非常相似。我已经运行了教程服务器,并且可以与多个客户端一起使用。 我是网络编程的新手,所以如果这是一个初学者问题或只是我忽略的愚蠢问题,我深表歉意。
【问题讨论】:
标签: c++ sockets tcp network-programming