0
我下面的教程(靠近該部分的底部大碼塊) 這裏:http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select 和主服務器代碼的代碼是像這樣:爲什麼在使用select()「break」第一個連接時連接到第二個套接字的服務器?
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已經連接和我連接一個新的客戶,我所看到的是:
- 第1位客戶不再發送或接收來自服務器任何東西(的結論,因爲沒有什麼是打印到stdout上客戶端)
- 第2位客戶正在按預期
- 當第二個連接退出時,服務器會計算爲兩個連接退出(打印
CONNECTION CLOSED
兩次)
我試圖保持這個非常相似的教程代碼。我已經運行了教程服務器,並且可以按照預期與多個客戶端一起工作。 我是新來的網絡編程,所以我很抱歉,如果這是一個初學者的問題,或者只是我忽略了一些愚蠢的東西。
啊拍!當我從只允許單個客戶轉換到多客戶時,我忽略了這一點。謝謝! – Lightgod131