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())しました。
WSAETOOMANYREFS 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 件のコメント:
コメントを投稿