2009-07-21 1 views
0

私は、クライアントからの着信接続を待つLinuxサーバープログラムを持っています。ここで擬似コードソケットがLinuxで開いているかどうかを確認するためのテスト

setup_socket(); 

while(1) 
{ 
    listen(); 
    newfile_descriptor = accept(); 
    int command 
    read(newfile_descriptor,&command,sizeof(int)); 
    switch(command) 
    { 
     ... 
    } 
} 

あるしかし、私は同じクライアントで複数のコマンドを送信する場合には、(新しい接続が行われていないので)永遠にリッスンします。新しいものを聞く前に既に接続があるかどうかを確認する方法はありますか?

答えて

2

どのようにコマンドを読んでループについて:あなたが必要なもの

setup_socket(); 

while(1) 
{ 
    listen(); 
    newfile_descriptor = accept(); 
    int command 
    command = read(newfile_descriptor,&command,sizeof(int)); 
    while(command) { 
    switch(command) 
    { 
     ... 
    } 
    // get next command, or figure out closed connection 
    command = read(newfile_descriptor,&command,sizeof(int)); 
    } 
} 
1

あなたはもう少しソケットから読むことができますか?私が入ってくるより多くの何がない場合は、コマンドの最後に、あなたの接続を閉じなければならないと思うだろう

1

は、いくつかありますクライアントがコマンドの送信を完了したことをクライアントに知らせる基本プロトコル。これは、クライアントがコマンドを送信し続けるのと同じくらい簡単なことができ、それ以上送信する必要がなくなったときにソケットを閉じます。その場合、ソケットが閉じられるまでソケットからの読み取りを続けるだけです。あなたの擬似コードでは、次のようになります。

setup_socket(); 

while(1) { 
    listen(); 
    newfile_descriptor = accept(); 

    int command; 
    do { 
     command = read(newfile_descriptor,&command,sizeof(int)); 

     if (command > 0) { 
      switch(command) { 
       ... 
      } 
     } 
    } while (command > 0); 
} 
2

次のいずれかselect/pollとソケットIOを分離、または別のスレッドがクライアントソケット上でコマンドを読みました。

1

ニコライの反応を詳しく調べるには、不可欠なBeej's guidesをチェックしてください。 while(1)ループ内でaccept()を呼び出した直後に、新しいスレッドを生成することは非常に標準的な方法です。このスレッドは、クライアントとのすべての通信を処理します。これにより、メインスレッドは、新しい着信接続をlisten()し、到着時にaccept()を続けることができます。

Hereは私が知っているselect()の特定のセクションですが、実際には使用されていません。

1

最初のもの... whileループの外側でlisten()を移動することです。 :p

関連する問題