将数据发送到我的服务器上连接的多个客户端

时间:2012-10-24 09:42:18

标签: c linux sockets

我有这个客户端可以连接的服务器应用程序。现在我希望当客户端连接时,我可以向所有客户端发送数据。当我连接我的两个客户时,我设法做到了。我的两个客户收到了我发送的内容。但我的问题是当我连接client1然后发送数据到服务器,client1可以接收数据然后我连接client2和我发送数据到服务器。现在当我从服务器向我的客户端发送数据时,只有client1可以接收数据但是当我断开客户端1时,client2可以从服务器接收数据。

如何让它们同时工作?..另外如何让我的服务器同时从我的客户接受消息?...

这是我遇到问题的代码部分。

for(j=0;j<MAX_CLIENTS; j++)
Clients[j].connected_sock = -1;


do
   {

      fduse = fdin;

      printf("Waiting for Connection\n");
      err = select(sMax + 1, &fduse, NULL, NULL, NULL);

      if (err < 0)
      {
     perror("  select() failed");
     break;
      }

      DescRead = err;
      for (SockStorage=0; SockStorage <= sMax  &&  DescRead > 0; ++SockStorage)
      {

      if (FD_ISSET(SockStorage, &fduse))
      {

        DescRead -= 1;


        if (SockStorage == socketFd)
        {
           printf("  Listening socket is readable\n");

           do
           {

              NewSFD = accept(socketFd,(struct sockaddr *) &cli_addr, &clilen);
              if (NewSFD < 0)
              {
                 if (errno != EWOULDBLOCK)
                 {
                    perror("  accept() failed");
                    DCSERVER = TRUE;
                 }
                 break;
              }

                if(ClientCount < MAX_CLIENTS){

                for(loop = 0; loop <MAX_CLIENTS; loop++){

                if(Clients[loop].connected_sock<0){

                Clients[loop].connected_sock = NewSFD;

                break;

                }

              }

              ClientCount++;
              }
              else
              {

              printf("Maximum Client Reached.\n");
              char *sendtoclient = "Server full. ";
              send(NewSFD, sendtoclient, strlen(sendtoclient),0);
              close(NewSFD);
              break;

              }

                ip = ntohl(cli_addr.sin_addr.s_addr);
                printf("  Connection from %d.%d.%d.%d\n",
                    (int)(ip>>24)&0xff,
                    (int)(ip>>16)&0xff,
                    (int)(ip>>8)&0xff,
                    (int)(ip>>0)&0xff);
                    dlogs(ip);


              FD_SET(NewSFD, &fdin);
              if (NewSFD > sMax)
                 sMax = NewSFD;

           } while (NewSFD != -1);


        }

        else
        {

        int d;
        for(d=0; d<MAX_CLIENTS; d++){

        printf("Descriptor ID: %d\n", Clients[d].connected_sock);

        }


          pfds[0].fd = fd;
          pfds[0].events = POLLIN;
          pfds[1].fd = SockStorage;
          pfds[1].events = POLLIN;
          state = FALSE;

           do
           {
            rc = poll(pfds, 2, -1);

            if (pfds[0].revents & POLLIN)
             {

              while ((nbytes = read(fd, buf, sizeof(buf)-1)) > 0)
               {

                      buf[nbytes] = '\0';
                     printf("%s\n", buf);

                   }

              pfds[0].events = 0;
              pfds[1].events = POLLIN | POLLOUT;

               }

            if (pfds[1].revents & POLLIN)
            {
              err = recv(SockStorage, strbuf, sizeof(strbuf), 0);
              if (err < 0)
              {
                 if (errno != EWOULDBLOCK)
                 {
                    perror("  recv() failed");
                    state = TRUE;

                 }
                 break;
              }

               if (err == 0)
              {
                 printf("  Connection closed\n");
                 state = TRUE;

                 break;
              }

              dSize = err;
              printf("  %d bytes received\n", dSize);
            }


            if (pfds[1].revents & POLLOUT)
            {

             int s;
             for(s=0; s<MAX_CLIENTS; s++){

                if(Clients[s].connected_sock>0){

                err = send(Clients[s].connected_sock, buf, strlen(buf), 0);

              if (err < 0)
              {
                 perror("  send() failed");


                 state = TRUE;

                 break;
              }

                }

            }
            pfds[0].events = POLLIN;
            pfds[1].events = POLLIN;
            }


           } while (TRUE);

以下是我如何向客户发送数据。

 int s;
             for(s=0; s<MAX_CLIENTS; s++){

                if(Clients[s].connected_sock>0){

                err = send(Clients[s].connected_sock, buf, strlen(buf), 0);

              if (err < 0)
              {
                 perror("  send() failed");


                 state = TRUE;

                 break;
              }

                }

            }

谢谢,

1 个答案:

答案 0 :(得分:0)

通常有几种可能的解决方案:

  1. 您可以为每个客户端连接使用单独的线程;
  2. 您可以使用select;
  3. 您可以使用民意调查;
  4. 你可以使用epoll;
  5. 在Windows环境中,还有一些其他可能性,例如IOCP。

    每个提到的解决方案都有一些优点和缺点(您通常需要区分简单性和性能)。

    您可以阅读一些网络编程教程以获取更多详细信息,例如: this