0

クライアントが接続できるこのサーバーアプリがあります。クライアントが接続されているときに、すべてのクライアントにデータを送信できるようにしたいと思います。2つのクライアントを接続すると、なんとかできます。送信したものは2つのクライアントによって受信されます。しかし、私の問題は、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;
              }

                }

            }

ありがとう、

4

1 に答える 1

0

一般に、考えられる解決策はいくつかあります。

  1. クライアント接続ごとに個別のスレッドを使用できます。
  2. 選択を使用できます。
  3. 投票を使用できます。
  4. epoll を使用できます。

Windows 環境では、IOCP などの他の可能性もあります。

上記の各ソリューションには、いくつかの長所と短所があります (一般に、単純さとパフォーマンスを区別する必要があります)。

詳細については、ネットワーク プログラミング チュートリアルを参照してください

于 2012-10-24T11:20:32.093 に答える