2017-09-06 7 views
-1

無限ループを使用してTCPサーバーからデータを受信して​​います より高い優先度を持つループで他のタスクを同時に実行する必要があります 制御はrecv()がTCPデータ。TCP関数recv()はループでは機能しません

while(1) 
{ 
     rdlen = read(fd1, buf, (sizeof(buf) - 1)); 
     if (rdlen > 0) 
     { 
      buf[rdlen] = 0; 
      printf("%s",buf); 
      memset(buf, 0, strlen(buf)); 
     } 
     if((numbytes=recv(sockfd, buf1, wGetLen, 0)) != -1) 
     { 
      printf("%s %d\n", buf1, numbytes); 
      memset(buf1, 0, strlen(buf1));         
     } 
} 

TCPがデータを受信するのを待たずに上記の操作を実行するにはどうすればよいですか?

+1

https://stackoverflow.com/questions/15108122/recv -with-non-blocking-socket –

+3

ソケットをノンブロッキングモードにしたり、 'select()'、 'poll()'などを使ってソケットから読み込もうとする前に利用可能なデータがあるかどうかを調べるソケット。 –

+2

カーゴカルチャープログラミング: 'memset(buf1、0、strlen(buf1));'これは危険なナンセンスです、IMHO – wildplasser

答えて

2

ソケットを非ブロッキングソケットとしてセットアップする必要があります。その場合、recvを呼び出しても何も受信されない場合、関数呼び出しはエラーコードとしてEAGAINのエラーを示す-1を返します。

あなたは

int fdflag; 
if ((fdflag = fcntl(sockfd, F_GETFL)) == -1) { 
    perror("Error getting socket descriptor flags"); 
    exit(1); 
} 
fdflag |= O_NONBLOCK; 
if (fcntl(sockfd, F_SETFL, fdflag) == -1) { 
    perror("Error setting non-blocking option"); 
    exit(1); 
} 

を次のように次のように続いて、あなたのrecvコールを変更することができ、ノンブロッキングフラグを設定することができます。

 if((numbytes=recv(sockfd, buf1, wGetLen, 0)) != -1) 
    { 
     printf("%s %d\n",buf1,numbytes); 
     memset(buf1, 0, sizeof(buf1));         
    } 
    else if (errno == EAGAIN) 
    { 
     printf("no data to receive\n"); 
    } 
    else 
    { 
     perror("error on recv"); 
    }  
+0

上記を使用して、他の操作を同時に行うことはできますが、データを受信することができる場合は "buf1"が空です。 – Sanket

関連する問題