0

私はこのようにクライアントを保存します。

   int MAXCLIENTS = 4;
   int ClientCount = 0;
   int FreeSpot[MAXCLIENTS];

    typedef struct CLIENTS_FD{

    int sock;
    struct sockaddr_in cli_adr;

    }cliuse;

    cliuse MYCLIENTS[4];

do{

    NewSFD = accept(ServerFD,(struct sockaddr *) &cli_addr, &clilen);
              if (NewSFD < 0)
              {
                 if (errno != EWOULDBLOCK)
                 {
                    perror("  accept() failed");
                    DCSERVER = TRUE;
                 }
                 break;
              }
               if(ClientCount < MAXCLIENTS){
                for(loop = 0; loop < MAXCLIENTS; loop++){

                if(FreeSpot[loop]<0){

                Clients[loop].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);


}while(NewSFD != -1);

クライアントのファイル記述子を保存できることはわかっていますが、クライアントの構造体を保存して後で使用するにはどうすればよいですか?..ip192.168.5.10でクライアントにメッセージを送信したいとします。

ありがとう。

4

1 に答える 1

0

ネットワークプログラミングに関する重要なポイントを見逃していると思います。開始方法の詳細と情報については、これを読む必要があるかもしれません。

それにもかかわらずaccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)、2番目のパラメーター()であるクライアントアドレス構造を埋めますstruct sockaddr *addr。その後、このアドレスをCLIENTS_FD構造体に簡単に追加できます。

Clients[loop].sock = NewSFD; 

Clients[loop].cli_adr = cli_addr;

クライアントがcliuse(または)であると仮定しstruct CLIENTS_FDます。

とにかく、上記のいくつかのコメントで述べたように、このアドレスをどこにも保存する必要はありません。クライアントと通信するために必要なのは、クライアントsockfd(acceptによって返される)だけです。

さらに、コードにいくつかのバグがある可能性があります。

int FreeSpot[MAXCLIENTS];

は初期化されていないので、チェックしようとすると

if(FreeSpot[loop]<0)

これは間違った動作につながる可能性があります。次のチェックの前にint FreeSpot[MAXCLIENTS] = {0};、どこかに(おそらくif(FreeSpot[loop]<0)ステートメント内に)このようなものを追加して適切に設定する必要があります。FreeSpot[loop] = 1;

int MAXCLIENTS = 4; 

int FreeSpot[MAXCLIENTS];

C99以降、定数以外のものを使用してテーブルを宣言することが可能です。これはVLA(可変長配列)と呼ばれます。それにもかかわらず、あなたの場合、VLAを使用する意味がわかりません。#define MAXCLIENTS 4代わりに試してください(上記のコメントで示唆されているように)。

クライアントに書き込むには、do-whileループから戻った後、次のようなものを使用できます。

send(Clients[i].sock, msg, len, flags);

ここで、iはクライアントの番号(範囲0〜3)であり、ここでもクライアントがcliuse(またはstruct CLIENTS_FD)であると想定しています。

于 2012-10-24T07:57:42.677 に答える