3

かなり単純なクロスプラットフォームの TCP ソケット プログラミングを行っています。残念ながら、Windows でコンパイルすると、私のソケットはデフォルトで非ブロックであるのに対し、OS X ではデフォルトでブロックされることがわかりました。Windows でソケットを強制的にブロッキング モードにするにはどうすればよいですか? 通常はデフォルトでノンブロッキング モードになっているのでしょうか、それとも何かひどく間違っているのでしょうか?

私のコードは、これらの簡単な例に部分的に基づいています: http://cs.baylor.edu/~donahoo/practical/CSockets/code/TCPEchoClient.c http://cs.baylor.edu/~donahoo/practical/CSockets/コード/TCPEchoServer.c

4

2 に答える 2

4

いいえ、単純な古い BSD スタイルのソケットは、Windows ではデフォルトでノンブロッキングではありません。Winsock Programmer's FAQの例を参照してください。

MFC とその CAsyncSocket の混乱を使用する場合、はい、すべてノンブロッキングですが、それは別の問題です。

于 2009-08-31T13:09:11.617 に答える
3

この参照が役立つと思います。特に注意してください

ソケットでのブロック操作はWindowsSocketsでサポートされていますが、それらを使用することは強くお勧めしません。ブロッキングモードの使用を制限されているプログラマーは、たとえば、移植される既存のアプリケーションの一部として、WindowsSocketsでのブロッキング操作のセマンティクスに注意する必要があります。

ここにリストされている無数の問題を十分に認識していて、Unixからの半分のビープ音のポートではなく、Windowsにうまく適合するようにプログラムを設計するよりも、それらすべてに対処する方が望ましい場合は、 ioctlsocket呼び出しを実行してください。 cmd引数はFIONBIOに設定され、3番目の引数は0に相当するロングワードを指しています。ただし、警告されなかったとは言わないでください;-)。

于 2009-08-30T05:02:30.040 に答える