電子制作屋 - 組み込み、ロボット、Linux、AVR,MSP430

Linux

2011 年 08 月 22 日

TCP / IPプログラミング-タイムアウト、多重化、非ブロッキング

ブロックモード(ブロック)へのTCP接続は、recvなどの関数はデフォルトで、つまり、関数の到着が復帰しない、とくるデータがあるかどうかを我々は時々関係なく、一定時間後に返すようにタイムアウトのメカニズムを必要とする前にデータがあるまでここでは、setsockopt()関数を使用します。
int型のsetsockopt(int型の、int型のレベルは、socklen_t、INT optnameには、void * optvalの* optlen引数);
ここでは、構造が関与する必要があります。
構造体timeval
{
time_t型tv_secの;
time_tはtv_usecの;
};
秒単位以下は、最初のフィールド、マイクロ秒単位の番目のフィールド。
構造体timeval tv_out。
tv_out.tv_sec = 1;
tv_out.tv_usec = 0;
この構造体に充填した後、我々は、この関数は、以下の方法で呼び出すことができます。
でsetsockopt(fdは、SOL_SOCKET、SO_RCVTIMEO、&tv_outは、sizeof(tv_out))、(特定のパラメータは男に見える、またはMSDNを確認することができます)
だから我々はrecvを()tv_outより多くの時間を設定し、データは(recvを何も聞こえないのタイムアウト機構、の機能を設定する)は0を返します。

2つ目は、同時に複数のソケット接続を監視している多重化メカニズムを導入しなければならないことです。
int型を選択(int型のn、fd_setの* readfds、fd_setの* writefdsに、fd_setの* exceptfdsに、構造体timeval *タイムアウト);
これは、fd_set構造体に関連しています。
typedefは構造体fd_setの
{
u_int fd_count;
int型fd_array [FD_SETSIZE];
}
fd_arrayソケット番号、我々が耳にするソケットが含まれている唯一のint型の配列に格納されているfd_set構造体をfd_count。
最初に、我々は、fd_setの構造を聞くためにFD_SET私たちのソケットを使用する必要があります。
fd_setのreadfd;
FD_SET(fdは、&readfd);
我々は、この機能を選択呼び出します。
選択(max_fd + 1、&readfd、NULL、NULL、NULL);(特定のパラメータは男に見える、またはMSDNを確認することができます)
FD_ISSET(fdは、&readfd);
コー​​ルが、そのプラス1を選択することであるがこれは、私たちのために価値の最も大きいのいずれかをlistenするソケットをmax_fd、readfd私たちは、ソケット接続からの読み込みを待機している、第三引数は、我々が聞くことです。ソケット接続への書き込みに、異常な番目のパラメータ、そして最後のパラメータはここから設定するために使用できることも、上記の構造体timeval構造体を使用して、同じ効果を達成することができます。 接続はここに来ている場合は、ゼロより大きい値を返すよう選択し、我々は特定のデータを持っているソケットをテストするためのFD_ISSETマクロを呼び出します(FD_ISSETが非ゼロ値を返す)入力されます。

大型のfd_setの構造のため、1024以上(数ソケットを監視するためにいくつかのアプリケーションでは(特に選択で、役割を果たすと非ブロッキングメソッドの最後に別の一種)の関数UNIXシステムの一部)を使用すると、この制限を破りたいとする場合は、ヘッダファイルを変更し、カーネルを再コンパイルする必要が、制限数1024を作ったそのソケットのすべてを監視することができます、我々は選択多重化メカニズムを使用することはできません。
recv()関数を取る、我々はこの呼び出しを行うことができます。
はrecv(fdは、bufには、sizeof(buf)の、MSG_DONTWAIT);
我々はここでMSG_DONTWAITフラグを使用することに注意して、その役割は、データがすべてのデータを受け入れるようになったと、データがどんな待たずに、即座に返ってこない場合、すぐに戻すならば、recv()関数を、伝えることです。 このメカニズムは、すべての接続をリッスンするようにfor()ループを使用して1024以上のソケット接続で使用することができます。

ポイントは、私の目の前二つの投稿で使用される特定のメソッドを参照して説明。

コメントする

この投稿へのコメントの RSS フィード。 TrackBack URL