0

クライアント/サーバーのアドレス帳に問題があります。最初のクライアントに接続すると、すべて問題ありません。その後、サーバーは他のクライアントからの他の接続を受け入れますが、どの要求にも応答しません (番号の追加など...) どうすればよいですか? ありがとうございました

int optval;
socklen_t optlen = sizeof(optval);
char choice[MAX];
char buff[MAX]; /* dati di invio e ricezione */
char buff1[MAX];
char buffNome[MAX];
char buffCognome[MAX];
char buffTelefono[MAX];
char buffMail[MAX];
struct sockaddr_in server_addr; /* indirizzo del server */
struct sockaddr_in client_addr; /* indirizzo del client */
int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */


if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    printf("Errore nella creazione del server\n");





optval = 1;
optlen = sizeof(optval);
if(setsockopt(sd_server, SOL_SOCKET, SO_REUSEADDR, &optval, optlen) < 0) {
  perror("setsockopt()");
  close(sd_server);
  exit(EXIT_FAILURE);
}

server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
server_addr.sin_port = htons(1745); /* la porta in ascolto */
server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server bisogna associargli l'indirizzo della macchina su cui sta girando */


if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    printf("Errore di binding\n");




listen (sd_server, 20);

int address_size = sizeof(client_addr); 

struct elemento *lista = NULL;
struct elementoutente *listautente = NULL;

  while (1) {
if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &address_size)) < 0)
    printf("Errore nella chiamata accept\n");




while(1){

.... CODE.....


}
close(sd_server);
4

2 に答える 2

0

呼び出すリスニング ソケットをノンブロッキングとして受け入れるようにします。接続されているすべてのクライアント ソケットもノンブロッキングにします。これらすべてのソケットでトップレベルの select/poll/epoll を使用します。接続されたソケットでイベントが発生した場合、またはリッスンしているソケットでクライアントが接続を待機している場合は常に、通知を受け取ります。その通知を処理します。これは、個別のクライアント ハンドラーの fork やマルチスレッド化を行わずに、1 つのプロセスのみを使用する効率的な方法です。

于 2012-07-14T19:37:04.780 に答える
0

1 つのクライアント要求のみを処理してからループを受け入れるように戻ると、スレッドや分岐なしで回避できます。つまり、内側の while(1) ループを取り除きます。クライアントがソケットを開き、1 つのリクエストを作成してから、ソケットを閉じていることを確認してください (これは HTTP 1.0 の通常の操作です)。

これは非常に非効率的ですが、うまくいくでしょう。

于 2012-07-13T10:24:09.893 に答える