2012-05-10 15 views
5

私たちはいくつかのクライアントで非常に単純なサーバーをC言語で実装する必要があります。システムV IPCキューを使用すると、クライアントが登録されるキューを1つ作成し、すべてのクライアントに対して、メッセージを含むキューが1つ存在するという考えがあります。私はサーバーの部分について少し不思議です。したがって、すべての時間間隔のために、私はすべてのキューをチェックして、私がしなければならない何を、または多分私はキューの少なくとも一つがする準備ができているサーバーに通知するための信号を使用する必要がありますCで非常に単純なサーバー

while(1) 
{ 
    //some queue using code 
    sleep(100); 
} 

:私はこのような何かを持っている必要があります管理する。

通常のサーバーではどのように処理されますか?時間間隔があり、実行する必要があるすべてをチェックしているか、これを行うには適切な方法がありますか?

これは非常に基本的な答えは、その場所にあると定義し、プロトタイプを必要とするが、しかし、あなたの基本的な選択、例を与える必要があります:

+8

Cの典型的なネットワーキングコードは、通常、['select()'](http://stackoverflow.com/questions/4171270/select-function-in-socket-programming)のようなもので実行されます。これはイベントベースです。ここではかなり良いガイドです(少なくとも私が使用したとき):http://beej.us/guide/bgnet/ – birryree

+0

select()関数はSystem Vのキューのidで動作しますか? – Andna

+1

私はそれについてはわかりません(おそらく7年でSystem Vのものに触れていません)。しかし、私が上にリンクしているガイドの一部は、System Vのキューの使い方についても議論しています:http://beej.us/guide /bgipc/output/html/multipage/mq.htmlあなたのケースでは、クライアントはソケット/ディスクリプタに接続して選択させ、 'select()'の代わりにキューを管理するようにします。キューに入れてください)。 – birryree

答えて

3

あなたはこの線に沿って何かをしなければなりません。

このコードは、freebsd、ubuntu、およびmy windowsコンピュータ(正しいヘッダーがあると仮定します)で動作します。また、一部が削除され、いくつかの定義が削除されています。 。 FreeBSDの:あなたは、UNIX IEのソケット上の任意の力仕事をしている場合、それはお勧めの選択ではないものの

struct timeval timeout; 
int rc 
fd_set wfdset,rfdset,errfdset; 
//Do some checks put them in either read fdset or write fdset or error fdset 
FD_SET (socket_sd, &rfdset); 
timeout.tv_sec = 0; 
timeout.tv_usec = 250 * 1000; 
rc = select (maxfds + 1, &rfdset, &wfdset, NULL, &timeout); 
//loop through the sockets and read from them at this point. 

選択は、Win32のに移植だけでなく、UNIXです。もっと深くなり、あなたのソケットをよりよく管理する必要がある場合は、kqueueやepollなどを使用してください。

関連する問題