2012年7月24日火曜日

Winsockのエロガプ説明




winsock.hにそうなっている

#define WSABASEERR 10000

#define WSAEINTR(WSABASEERR +4)

#define WSAEBADF(WSABASEERR +9)

#define WSAEACCES(WSABASEERR +13)

#define WSAEFAULT(WSABASEERR +14)

#define WSAEINVAL(WSABASEERR +22)

#define WSAEMFILE(WSABASEERR +24)

。 。 。 。 。

大まかにこのようになっている。参考にもまた図表で整理をしました。後に、ソケットのプログラミングを行う際は、ソケット関数がエラーが発生した場合、そのエラー

コー​​ドを取得した後、エラーコードに応じて関数が失敗した原因を確認してみればなる

ソケットは、それぞれの関数がエラーが発生した場合、UNIXの場合は-1が返されWinsockのはINVALID_SOCKETかSOCKET_ERRORを返します。ソケットにする
数ハンドル値を取得する関数であればINVALID_SOCKETにエラーを比較する必要があり、他の一般的なソケット関数はSOCKET_ERRORと検査を
となる。ここで単純に関数が成功なのかシルペニャ万出たら、プログラマの立場でエラーをキャッチが非常に難しくなる。

そのため、ソケットの関数は、正確な原因は何かを指してくれる。だからエラーの種類を事前に数値の定義をすべておいています。
エラーが出た時、そのエラーコードを返却します。 Unixソケットは、グローバル変数であるerrnoという変数にエラーコードが入っていて
WinsockのはWSAGetLastError()関数を呼び出して知ることができる。次のコードを見てみよう


まず、Unixソケット上で取得する方法は、
int sock;

/ /取得に失敗すると-1を返します
sock = socket(AF_INET、SOCK_STREAM、IPPROTO_TCP);
if(socket <0){printf( "socket()Error .. - > Error Code%d"、errno);
}

で、Winsockのは

SOCKET sock;

/ /取得失敗した場合INVALIDE_SOCKETを返します
sock = socket(AF_INET、SOCK_STREAM、IPPROTO_TCP);
if(socket == INVALID_SOCKET)
{
printf( "socket()Error .. Error - > Code%d"、WSAGetLastError());
}

Windowsソケットエラー値の説明

WSAEINTR 10004

ブロックされるWinsockの完了にWSACancelBlockingCall関数でキャンセルされました


WSAEBADF 10009

間違った記述子(ソケットハンドル)である


WSAEACCES 10013

ブロードキャストアドレスのためのデータグラムソケットの接続の試行はsetsockopt関数でSO_BROADCASTが設定されていない状態で失敗しました。


WSAEFAULT 10014

nameまたはnamelenパラメータが正しい型ではありません。


WSAEINVAL 10022

acceptする前に、listen関数が呼び出されていません。


WSAEMFILE 10024

新しいソケットに割り当てるためのソケット記述子が残っていません

WSAEWOULDBLOCK 10035

ソケット関数がビブルロクキンモードで動作している

WSAEINPROGRESS 10036

ブロック関数が呼び出されるときに、不適切なソケット関数が呼び出された

WSAEALREADY 10037

既に完了した非同期コマンドのキャンセルがシドドゥェム


WSAENOTSOCK 10038

指定されたディスクリプタがソケット記述子はありません


WSAEDESTADDRREQ 10039

この関数の目的地アドレスが必要ですが、提供されていない


WSAEMSGSIZE 10040

受信したメッセージが指定したバッファに格納するには大きすぎて失われました


WSAEPROTOTYPE 10041

指定されたプロトコルが正しくないか、このソケットに対して無効な型です


WSAENOPROTOOPT 10042

不明なオプションであるか、サポートされていないオプションを使用しています。


WSAEPROTONOSUPPORT 10043

指定されたプロトコルがサポートされていない形式です



WSAESOCKTNOSUPPORT 10044

指定されたソケットタイプが指定されたアドレスシステムでサポートされていない形式です


WSAEOPNOTSUPP 10045

socketがヨンギョルジヒャンヒョンサービス(SOCK_STREAM)の形がありません。 ex)listenがUDP socketでの呼び出し



WSAEPFNOSUPPORT 10046

指定されたプロトコル体系が(PF_ *)はサポートされていません



WSAEAFNOSUPPORT 10047

指定されたアドレスシステムが(AF_ *)はサポートされていません



WSAEADDRINUSE 10048

指定したアドレス(IP)が既に使用されている



WSAEADDRNOTAVAIL 10049

指定されたアドレスはローカルマシンで使用することができない



WSAENETDOWN 10050

ネットワークサブシステムにエラーが発生しました



WSAENETUNREACH 10051

リモートシステムまでのネットワークが到達することができません



WSAENETRESET 10052

演算が行われている間に接続が切れてしまいました。



WSAECONNABORTED 10053

接続がout-of-bandやその他の障害のために切れてしまいました。



WSAECONNRESET 10054

リモート接続先で "hard"や "abortive"シャットダウンを実行してリセットしました。



WSAENOBUFS 10055

Windowsソケットシステムのバッファ領域が足りなかったり、アプリケーションによってAPIに提供された領域が小さすぎて要求された情報を保存することができません。



WSAEISCONN 10056

指定されたソケットが既に接続されている



WSAENOTCONN 10057

指定されたソケットが既に接続されていません



WSASHUTDOWN 10058

ソケットがシャットダウン(shutdown())しました。



WSAETOOMANYREF​​S 10059

指定した関数の引数が多すぎる



WSAETIMEDOUT 10060

接続がタイムアウトしました。



WSAECONNREFUSED 10061

接続の試行は強制的に終了しました



WSAELOOP 10062



WSAENAMETOOLONG 10063



WSAEHOSTDOWN 10064

リモートホストがダウンしていました



WSAHOSTUNREACH 10065

ネットワークシステムの障害などによって、リモートホストまでの月ができません。


WSASYSNOTREADY 10091

ネットワークサブシステムがまだ通信の準備ができていない(WSAStartup()が返す)


WSAVERNOTSUPPORTED 10092

要求されたWindowsのソケットのバージョンが、現在、Windowsソケットの実装でサポートされていません。


WSANOTINITIALISED 10093

この関数を使用する前に、成功したWSAStartup関数の呼び出しがなかった。


WSAHOST_NOT_FOUND 11001

ホストを見つけることができません。


WSATRY_AGAIN 11002

要求された情報が見つかりません



WSANO_RECOVERY 11003

回復できないエラーが発生


WSANO_DATA 11004

無効な名前(name)にはデータが記録されていません。

0 件のコメント:

コメントを投稿