1

我的程序的目标是使用 select 来管理多个套接字。但是,我想先用一个插座试试。现在,我面临的问题是最初客户端向服务器发送数据,服务器接收并显示它,但是当客户端再次发送一些数据时,服务器代码仍然处于选择命令中。

这里有一些片段可以让您了解我如何初始化套接字。

if((master_socket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
    {
      exit(1);
    }

    if((bind(master_socket, (struct sockaddr *)&req, sizeof(req))) < 0)
    {
      exit(1);
    }

    listen(master_socket, 5);
    FD_SET(master_socket,&listening);

    /* wait for connection, then receive and print text */
    len = sizeof(struct sockaddr);
    while(1)
     {
            FD_ZERO(&listening);  //Flush out everything in socket
        FD_SET(master_socket,&listening); // Add master
        if(f_client>0)           // Add client if any
        {
            FD_SET(f_client,&listening);
        }
        printf("Checking for new connection \n");
           //Timeout is null, so waiting indefinitely
        rc = select(FD_SETSIZE, &listening, NULL, NULL, NULL);

     if (FD_ISSET(master_socket, &listening))
        {
          printf("Master side invoked\n");
          if((f_client = accept(master_socket, (struct sockaddr *)&req, &len)) < 0)
          {
             exit(1);
              }
            }

    else if (FD_ISSET(f_client,&listening))
    {
         if ((valread = read( f_client , buf, 1024)) == 0)
         {
            close(f_client);
            f_client=0;
         }
         else
         {
            fputs(buf, stdout);  
         }

    }

}

基本上在上面的程序中,它连接到服务器,为客户端维护一个文件描述符f_client并添加它。并且在每一轮中,它都会清除套接字,添加主套接字和客户端套接字(如果有),然后检查。这里的问题是,第一次它工作,但第二次客户端发送一些数据。它挂了rc = select(FD_SETSIZE, &listening, NULL, NULL, NULL);

我不明白这里出了什么问题。任何人都可以帮忙吗?

4

1 回答 1

4
     if ((valread = read( f_client , buf, 1024)) == 0)
     {
        close(f_client);
        f_client=0;
     }
     else
     {
        fputs(buf, stdout);  
     }

此代码已损坏。该fputs函数只能与 C 风格的字符串一起使用。您只是拥有没有特定结构的任意数据。既然你忽略valread了,你也不知道你读了多少字节。(想一想,怎么fputs可能知道要输出多少字节?该信息仅在 中valread,而您不会将这些信息传递给它。)

您已经收到了数据,这个损坏的代码只是把它扔掉了。如果你 log valread,你会看到你实际上已经在你最后一次调用时读过它,read然后再调用select那个挂起。

而不是fputs,你可以使用这样的东西:

for (int i = 0; i < valread; ++i)
   putchar(buf[i]);
于 2013-01-27T21:22:58.140 回答