我很困惑,我有一個服務器通過select()。我可以接受一些客戶。 但我只是在最後連接服務器時才從客戶端讀取信息。例如: :A,B,C的客戶端依次連接服務器。服務器剛剛打印出來的數據爲 。 你能告訴我爲什麼嗎?謝謝。 的主要代碼:選擇和一些客戶
謝謝,我已經更新了問題,我有http://www.gnu.org/s/hello/manual/libc/Server-Example.html
改變的代碼,但問題還是來了。 我仍然只從最後一個獲得數據。而我無法從前者獲得數據 。
主代碼是:
INT read_from_client(INT與filedes)
{ 字符緩衝區[MAXMSG];
int nbytes;
nbytes = read(filedes, buffer, MAXMSG);
if (nbytes < 0)
{
/* Read error */
perror("read");
exit(EXIT_FAILURE);
}
else if (nbytes == 0)
/* End-of-file. */
return -1;
else
{
/* Data read. */
fprintf(stderr, "Server: got message: '%s'\n", buffer);
return 0;
}
}
INT ts_server_poll(結構tcp_server *服務器,timeval結構*超時) {
無符號整型I;
int nready,sockfd,k,j;
<br>//reset the fd set
_server_set_fd(server);
printf("maxfd is %d\n", maxfd);
FD_SET(server->fd, server->fd_set);
while (1)
{
/* Block until input arrives on one or more active sockets. */
server->fd_readset = server->fd_set;
if (select(FD_SETSIZE, server->fd_readset, NULL, NULL, NULL) < 0)
{
perror ("select");
exit(EXIT_FAILURE);
}
/* Service all the sockets with input pending */
for (i = 0; i < FD_SETSIZE; ++i)
if (FD_ISSET(i, server->fd_readset))
{
if (i == server->fd)
{
/* Connection request on original socket. */
int new;
new = (int)accept(server->fd, 0, 0);
if (new < 0)
{
perror("accept");
exit(EXIT_FAILURE);
}
FD_SET(new, server->fd_set);
}
else
{
/* Data arriving on an already-connected socket. */
if (read_from_client(i) < 0)
{
close(i);
FD_CLR(i, server->fd_set);
}
誰教你使用這種縮進?你的代碼很難閱讀。如果您希望社區爲您提供幫助,請讓社區更輕鬆。 – qrdl 2011-05-03 06:23:16
我編輯了那裏的內容以使其可讀,但我不確定我能否推斷一個問題。 – 2011-05-03 06:26:54
這裏沒有代碼接受新連接或將它們添加到讀取集。 – 2011-05-03 06:31:13