[Winsock] UNIXのerrnoまわりの移植

WinsockとUNIX系のちょっとした違いで移植したプログラムの動きが「少し」違う。
たとえば、エラーコード。
UNIX系ではerrnoで見ることが一般的だ。
Winsockでもerrnoのマクロを使ったままで移植することもできなくはないようだ。
errno.hとWinsockのエラーコードの対応させ方
http://msdn.microsoft.com/en-us/library/ms737828(VS.85).aspx
Winsock.h内でBSDスタイルのerrnoマクロが定義されているので、どうしても使いたければそこの部分を活かせばいい。通常は#if 0でコメントアウトされている。
さらに以下のコードを入れる。

#include <windows.h>
#define errno WSAGetLastError()

ほぼerrnoを使ったソースコードをそのまま移植できるようにできる。

r = recv(...);
if (r == -1
&&  errno == EWOULDBLOCK)
{...}

ただ、Windowsの他の部分と邪魔し合ったりするかもしれないし、他の部分で書き換えをすることになるだろうから、Winsockに対応した書き換えをしたほうがいいのではないか、と最近は思う。
ネットワークプロトコルはOSに依存する部分だと割り切って、Windows風に以下のように書く。

r = recv(...);
if (r == -1       /* (but see below) */
&& WSAGetLastError() == WSAEWOULDBLOCK)
{...}

WinsockではBSDのエラーマクロに対応したものが WSAを頭に付けた名前になっている。詳細なリストは以下のドキュメントに書かれている。
winsockが出すエラーコード表
http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx

広告
%d人のブロガーが「いいね」をつけました。