*
* :

October 8, 2004

winsock2

SocketのプログラムをWindowsで書く場合、winsock.hまたはwinsock2.hをインクルードすることになる。

前者はVersion1のWinSockで、後者はVersion2となっていて、TCP、UDP以外のプロトコルを使いたい場合や、高速な通信を行いたい場合は多機能な新バージョンの WinSock Ver2 を用いるわけだが、ここには罠が存在している。

winsock.h と winsock2.h は互いに排他的で、同時に使用することはできない。(関数や構造体が同名異義となっているものがある)そこでwinsock2.hだけをインクルードしようとするわけだが、実はwindows.h内部でwinsock.hがインクルードされているのだ。

これを回避するためには、windows.hをインクルードする前に _WINSOCKAPI_ を define する。
こうするとwinsock.hがインクルードされても、中身をパスしてくれるのでwinsock2.hをインクルードしても定義の重複は発生しない。

ライブラリなどを組んでいるとあちこちのソースファイルで windows.h をインクルードしているので、結構面倒くさいものである。よって#defineでコード中に記述するより、プロジェクトオプションで定義したほうがよいだろう。しかし、DirectXのライブラリ(d3d9.hとか)でも普通にwindows.hインクルードしてあるので、この場合、手が出せない。この場合ワーニングが出まくるのを我慢するか #pragma warning ( disable : 4005 ) としてワーニングを消してしまう他方法はないものと思われる。

後から追加されたライブラリであることから、しかたないともいえるかもしれんがこの実装はどうかと思うな。

* :
* :
Posted by Kyo-N at October 8, 2004 6:02 PM | トラックバック
コメント
コメントする








v 名前、アドレスを登録しますか?