2011-08-03 3 views
0

ここに私が今使っているコードの一部があります。私ははっきりとselect()関数は、擬似コードで、ここで、どのように動作するか理解していないソケットタイムアウト:それは動作しますが、なぜ、どのように、主にselect()関数ですか?

fd_set fdset; 
struct timeval tv; 
int flags = fcntl(sockfd, F_GETFL);  
fcntl(sockfd, F_SETFL, O_NONBLOCK); 

connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); 

FD_ZERO(&fdset); 
FD_SET(sockfd, &fdset); 
tv.tv_sec = 3;   
tv.tv_usec = 0; 

if (select(sockfd + 1, NULL, &fdset, NULL, &tv) == 1) 
{ 
    int so_error; 
    socklen_t len = sizeof so_error; 
    getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &so_error, &len); 
    if (so_error == 0) { 
     cout << " - CONNECTION ESTABLISHED\n"; 
    } 
} else 
{ 
    cout << " - TIMEOUT\n"; 
    exit(-1); 
} 

はやる、

bool showOnce = true; 

    connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) 
    while(stillConnecting) /*Some kind of flag of connection status*/ 
    { 
     if(showOnce) 
     { 
      showOnce = false; 
      cout << "Connecting"; 
     } 
    } 

    if(connected) /*Another possible flag if it exists*/ 
     return true; 
    else 
     return false; 

この擬似コードを実装するためにとにかくあり、私は本当に何をしたいですこれらのフラグは存在しますか?

EDIT:上記のコードのselect関数でもsockfd + 1はなぜですか?なぜそれに追加されますか?

+0

'select()'のドキュメントを読んだときに何を学びましたか? –

+0

私はまだ実際には学んでいませんでした。申し訳ありませんが、私は主に組み込み開発を行い、簡単な通信のための簡単なPCプログラムを書く必要がありました。私は現在、このコメントを書くときにselect関数のmsdnページを読んでいます。私は擬似コードのようにソケットの状態をチェックするために使用することができると思います。しかし、どのように把握しようとしています。私はそこに行っています:) – vilive

答えて

2

マニュアルを読む:man 2 select

  1. nfds is the highest-numbered file descriptor in any of the three sets, plus 1.、なぜsockfd + 1ことです。
  2. select()は、要求されたイベントをトリガするディスクリプタの数を返します。 1つの記述子しか与えられないので、selectは最大で1に戻ることができます。
  3. 3秒後にタイムアウトが発生しても何も起こらない場合、select()1を返さないため、タイムアウトとみなします。エラー-1のケースは処理されません。
+0

男のためのその数字 '3'オプションは何ですか? – vilive

+0

「man 3 select」は、「マニュアルのセクション3(ライブラリ関数)」を意味します。実際にセクション2、システムコールを読むべきです。 –

+0

'man man'はそれを説明します。与えられたキーワードが複数のセクションに存在する場合は、マニュアルのセクションです。 - '3 'は_ライブラリ呼び出し(プログラムライブラリ内の関数)_を表します。 – Shi