1

I am looking for information on Windows network programming. Mainly how to get a single executable to cope with 1000 connections.

We use select() FD_ISSET etc on unix and this works very quick. On Windows these APIs are very poor. FD_SET is lots slower but even when working around this, Windows is lots slower than HPUX.

I'm looking for a win32 API call which I can use instead of the select() call which doesnt require so much CPU/time. Currently we spend 50% of the time (and CPU) in select(), where as on unix the time spent in send() and recv(), which is what I would expect.

Thanks Neil

4

2 に答える 2

2

おそらくWindows I/O Completion Ports を探しているでしょう。これはSysInternalsの連中による記事です。

于 2011-05-11T14:30:25.963 に答える
1

スケーラブルなソケット プログラミングに本当に興味があるなら、Windows の IO 完了ポートよりも優れたパフォーマンスを発揮するものはありません。

そうは言っても、あなたのプログラムは、完了ポートモデルのために大幅な書き直しが必要になるでしょう。

ただし、select()/FD_ISSET を使用してもパフォーマンスを向上させることができます。

winsock2.h では、fd_set は SOCKET の配列と要素カウンターとして定義されています。

typedef struct fd_set {
    u_int fd_count;               /* how many are SET? */
    SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
} fd_set;

また、winsock2.h では、FD_SET がこの配列の末尾に SOCKET を追加し、FD_ISSET が配列内で線形検索を行っていることがわかります。

SOCKET の並べ替えられた配列を使用するようにマクロを変更すると、つまり

  • FD_SET はソートされた順序でソケットを追加します
  • FD_ISSET は線形検索ではなく二分検索を行います

次に、配列のサイズに応じて FD_ISSET を大幅に改善できます (FD_SET のパフォーマンスは多少低下しますが、FD_SET はめったに操作されないと想定しています)。

Unix では、ビットマップとして FD_SET を使用するため、select() のパフォーマンスが向上します。FD_SET/FD_ISSET は、ビットをテストまたは設定するだけです。Windows では、socket は小さい正のファイル記述子番号ではなく、HANDLE であり、ハンドルのスカラー値が大きくなる可能性があるため、この手法は適用できません。

于 2011-05-11T14:48:53.727 に答える