2017-01-09 3 views
1

私はクライアントから一定量の回答を受けようとしています。どうすればいい?私はそのコードを持っていることを意味しますソケットから読み取るものがあるかどうかを検出する方法は? (C++)

unsigned secondsElapsed = 0; 
    while(secondsElapsed <= TIMER){ 
     char tBuffer[32]; 

    if (recv(clientSocket, tBuffer, sizeof(tBuffer), MSG_PEEK | MSG_DONTWAIT) == 0){ 
      myPlayer->dcPlayer(); 
      \\ More stuff to do if player is dissconected 
    \\ But if is not dc, and is typing, how can i check my socket to see 
    \\ if i have an answer there to read, else i`ll increment 
    \\ secondsElapsed until is equal to TIMER or until i get an answer  
    \\ from my client. 

    usleep(1000000); 
    secondsElapsed++; 
    } 

質問:私のクライアントが私に答えを送っているかどうかを確認するにはどうすればいいですか?私が読もうとすると、私のプログラムが止まってしまい、増分secondsElapsedできません。

+1

ルック'poll'、' select'、 'epoll'(と基本的なネットワーキングチュートリアル).. –

答えて

0

あなたはそれを読むためにデータが利用可能なときに知っている(* nixシステム上またはpselect()または(e)poll()select()を使用することができ、例えば:

char tBuffer[32]; 
float secondsElapsed = 0; 
clock_t start = clock(), end; 

do { 
    fd_set rfd; 
    FD_ZERO(&rfd); 
    FD_SET(clientSocket, &rfd); 

    struct timeval timeout; 
    timeout.tv_sec = TIMER - secondsElapsed; 
    timeout.tv_usec = 0; 

    int ret = select(clientSocket+1, &rfd, NULL, NULL, &timeout); 
    if (ret == -1) { 
     myPlayer->dcPlayer(); 
     break; 
    } 

    if (ret == 0) { 
     // timeout ... 
     break; 
    } 

    // data available, read it... 

    ret = recv(clientSocket, tBuffer, sizeof(tBuffer), 0); 
    if (ret <= 0) { 
     myPlayer->dcPlayer(); 
     break; 
    } 

    // use tBuffer up to ret number of bytes... 
    if (... /*no more data is expected*/) { 
     break; 
    } 

    end = clock(); 
    secondsElapsed = end - start; // time difference is now a float 
    seconds /= CLOCKS_PER_SEC; // this division is now floating point 
} 
while (secondsElapsed <= TIMER); 
4

ここにはいくつかのオプションがあります。まず、ノンブロッキングソケットを使用することができます(通常はそうではありません)。たとえば、* Nixのユーザーはselectpollepollから選択できますが、Windowsには独自の非同期イベント通知API(I/O完了ポートなど)がありますが、OS提供のポーリング/非同期通知メカニズムを使用することをお勧めします。ここで説明:あなたは、その後recv()(またはread())を呼び出す前https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365198(v=vs.85).aspx

+0

ウィンドウの場合は、これを使用します(非同期イベント通知API)。https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365198(v=vs.85)。 aspx –

+0

@ムージュース、ありがとう、組み込まれます。私のWindowsは非常に弱いです。 – SergeyA

+0

'select()'はWindowsで利用できます。 IOCPは、コードが読み込みの完了を待つのをブロックする必要がある場合には、残念です。 –

関連する問題