0

私の C アプリケーションでは、次の方法でソケット上のデータを待ちます。

printf("Opening socket and wait for data.\n");
while (i < 5)  
   while((connection_fd = accept(socket_fd, 
                            (struct sockaddr *) &address,
                            &address_length)) > -1)
   {
    bzero(buffer, 64);
    n = read(connection_fd,buffer,64);
    if (n < 0) printf("ERROR reading from socket");
    printf("Here is the message of length %d bytes:\n\n", n);
    for (int i = 0; i < n; i++)
    {
      printf("%02X", buffer[i]);
    } 
    printf("\n\n");          
    break;  
    }
 i++
 }

つまり、Socket から 5 回のデータを読み取るということですが、見た目では 5 つの異なる接続を開いているように見えますね。接続を一度だけ開き、それを維持してから、この接続で利用可能なデータがあるかどうかを確認することはできますか?

ありがとう、パトリック!

4

5 に答える 5

2

コードを再構築する必要があるため、新しい接続ごとに 1 回だけ受け入れる必要があります。

while (1) {
    connection_fd = accept(socket_fd, ...);

    /* check for errors */
    if (connection_fd < 0) {
      /* handle error */
    }

    /* note this could block, if you don't want
       that use non-blocking I/O and select */    
    while ((n=read(connection_fd, buf, ...)) > 0) {
        /* do some work */
    }

    /* close fd */ 
    close(fd);
}
于 2012-11-23T12:04:12.443 に答える
0

もちろん。while()そのためには、2つのループの引数を交換することをお勧めします。

while ((connection_fd = accept(socket_fd, 
                          (struct sockaddr *) &address,
                          &address_length)) > -1)
  while (i < 5)  
  {
    ...
于 2012-11-23T11:58:24.773 に答える
0

はい。ビットを削除しwhile (i<5)ます。その後、read必要に応じてさらにデータを読み取ることができます。

于 2012-11-23T11:58:33.677 に答える
0

簡単だ。ループの外にaccept関数を呼び出すステートメントを移動してから、同じソケット記述子を使用してreadを呼び出します。

于 2012-11-23T11:59:17.257 に答える
0
if (n < 0) printf("ERROR reading from socket");

なんで先に行くの?break;ループまたはcontinue;新しい接続のいずれか。

于 2012-11-23T13:16:23.777 に答える