选择和一些客户
我很困惑,我有一个服务器通过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);
}
你的代码缺少几件事......接受新的连接,并遍历读集中的所有描述符。
下面是如何在服务器上使用选择一个完整的例子:
谢谢我已经通过http://www.gnu.org/s/hello/manual/libc/Server-Example.html更新了它,但它仍然无法工作 – lxgeek 2011-05-04 06:06:27
你应该这样做的循环。我的意思是,检查FD_ISSET
从0到maxfd + 1
,然后是所有爵士乐。
for(sockfd = 0; sockfd < maxfd + 1; sockfd++) {
if(FD_ISSET(sockfd, server->fd_readset)) {
/* there is an event on sockfd */
}
}
我有一段时间没有使用select
,但你应该确定。另外,你可能想跳过描述符0,1,2,但这会很难看。
谢谢我已更新它,但它仍然无法正常工作。我是否使用非阻塞功能? – lxgeek 2011-05-04 06:07:13
谁教你使用这种缩进?你的代码很难阅读。如果您希望社区为您提供帮助,请让社区更轻松。 – qrdl 2011-05-03 06:23:16
我编辑了那里的内容以使其可读,但我不确定我能否推断一个问题。 – 2011-05-03 06:26:54
这里没有代码接受新连接或将它们添加到读取集。 – 2011-05-03 06:31:13