2012-04-13 14 views
0

これは私の場合です。接続をリスンするサーバと、今プログラミングしているクライアントがあります。クライアントはサーバーから何も受け取らず、3分ごとにステータスの更新を送信する必要があります。クライアントからサーバへの接続のみの受信の受信

私は、現時点では以下があります。

WSAStartup(0x101,&ws); 
    sock = socket(AF_INET,SOCK_STREAM,0); 
    sa.sin_family = AF_INET; 
    sa.sin_port = htons(PORT_NET); 
    sa.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    connect(sock,(SOCKADDR*)&sa,sizeof(sa)); 
    send(sock,(const char*)buffer,128,NULL); 

はどのようなアプローチはすべきですか?私はrecvを繰り返すことを避けることができますか?

答えて

0

これは、あなたが望む動作とプログラム構造に依存しています。 デフォルトでは、ソケットは読み取り操作または書き込み操作でブロックされます。つまり、サーバーのメインスレッドが接続をポーリングすると、3分間フリーズするか、クライアントが閉じるまで終了します接続。

絶対最も単純な機能液(NO multithreadding)は、非ブロッキングソケットを設定し、メインスレッド内にポーリングすることです。あなたがそれをやっているのを避けたいと思うように聞こえる。

その周りの最も明白な方法は、すべての接続のための専用スレッド、プラスメインリスナーソケットを作ることです。サーバーは受信接続をリスンし、作成した各ストリームソケットに対してスレッドを生成します。それから、各接続スレッドは、データを受け取るまでそれをソケット上でブロックし、それ自体を処理するか、共有キューにシャントします。 これは、かさばった複雑なソリューションです。オープンとクローズが必要な複数のスレッド、保護が必要な共有リソースです。

別のオプションは、(* NIXそれにO_NONBLOCKフラグを渡すの下ので、タイムアウトを設定するWin32用のsetsockopt下)、非ブロッキングソケットを設定することです。そうすれば、読み込み可能なデータがない場合は制御が返されます。しかし、これは合理的な間隔で合理的な間隔でソケットをポーリングする必要があることを意味します(合理的なことはあなた次第であり、サーバーが新しいデータを処理するためにはどのくらいの時間が必要ですか)。私は上記の組み合わせを使用します:ソケット(または非ブロッキングソケットの配列)を数秒ごとにポーリングし、その間でスリープして、単にメインスレッドのためにデータをキューにプッシュしている間にそれはメインループです。

あり、非同期プログラムを台無しに取得する方法はたくさんあるので、あなたは、制御フローに慣れまでは、それをシンプルに保つ、それが働いて得るために、おそらく最善です。

+0

何かを送信するたびに接続を切断し、次に何かを送信する必要があるときに新しい接続を開くと、このようにブロックされないようにします。それはどうやって聞こえる? –

+0

ええ、あなたはそれを行うことができます(そして、状況の更新だけを押しているのであれば、そうかもしれません)。問題は、データを読むときだけでなく、サーバーがaccept()でブロックすることになるということです。基本的に、サーバーは接続がいつ行われるかを保証することができないため、常にリスンする必要があります。あなたはタイムアウトを(両端で)設定し、両者が接続を形成する時間を知っていることに頼ることができますが、それはエラーが起こりやすいことです。編集:しかし、あなたのサーバーが行う必要があるのは、プロセスのステータスの更新だけです。そうすればうまくいくはずです。 – Bhau

+0

サーバーが常にリスニングしているかどうかは気にしません。私の元々の問題は、私が接続を閉じずにsend()を呼び出していて、最初のステータスだけがsendになっていて、これと同様のケース(http://stackoverflow.com/q/8347107/777510)これを避けるためにrecvを呼び出してループを送信する必要があったのですが、何らかの方法でループを回避できるかどうか、おそらく接続を送信したり閉じたりする必要があります。だから私はそれでうまくいくはずですか? –

関連する問題