Windows socket C言語プログラミング
14795 ワード
Windows socket C言語プログラミング関数の詳細
文書ディレクトリ Windows socket C言語プログラミング関数詳細 WSADATA WSAStartup socket sockaddr sockaddr_in inet_pton setsockopt bind() connect() recvfrom sendto()
WSADATA
WSAstartup関数によって呼び出された後に返される[Windows Sockets](https://baike.baidu.com/item/WindowsSockets)データ.Winsockが含まれていますdllが実行するデータ.
WAS(Windows Sockets Asynchronous、Windows非同期ソケット)
WSAstartup関数で呼び出されたWindows Socketsデータを格納します.Winsockが含まれていますdllが実行するデータ.
WSAStartup
WSAstartup関数でWinsockサービスの初期化を完了し、Socketを使用する前にWSAstartup関数を呼び出す必要があります.
wVersionRequested:プログラムが使用を要求したSocketバージョンを示します.上位バイトがサブバージョン、下位バイトがプライマリバージョンを示すWORD(2バイト)型の数値
lpWsadata要求されたSocketのバージョン情報を返すためのWsadatAデータ構造へのポインタ
例:
MAKEWORD():符号なし16ビット整数を作成し、2つの与えられた符号なしパラメータを接続する
socket
lpWSAdata:Windows Sockets実装の詳細を受信するためのWSADATAデータ構造へのポインタ
socket
af:アドレスファミリー(Address Family)、すなわちIPアドレスタイプであり、よく使われるのはAF_INETとAF_INET6.
INETは「Inetnet」の略です.AF_INETはIPv 4アドレスを表す.AF_INET 6は、1110::A 0 B 3:FA 21:48 AA:1 A 2 BのようなIPv 6アドレスを表す.
type:データ転送方式/ソケットタイプで、よく使われるSOCK_STREAM(ストリームフォーマットソケット/接続向けソケット)とSOCK_DGRAM(データ・レポート・ソケット/接続されていないソケット)
protocol:転送プロトコルを表し、よく使われるIPPROTO_TCP(TCP転送プロトコル)およびIPPTOTO_UDP(UDPトランスポートプロトコル).
戻り値:SOCKETタイプのハンドル
sockaddr
sa_を指定するとfamily=AF_INETの後、sa_dataの形式も固定されている:最先端の2バイトは16ビットのポートを記録し、続いて4バイトは32ビットのIPアドレスを記録し、最後の8バイトはゼロにクリアされる.
sockaddr_in
sin_zero:sockaddrとsockaddrをin 2つのデータ構造が同じサイズで保持される空のバイト
inet_pton
inet_ptonはIPアドレス変換関数で、IPアドレスを「ポイント10進数」と「バイナリ整数」の間で変換でき、inet_ptonとinet_ntopの2つの関数はipv 4とipv 6を処理することができる.
pとnはそれぞれ表現(presentation)と数値(numeric)を表す
af:アドレスクラスタ
src:ソースアドレス
dst:変換後のデータを受信します.
戻り値:成功した場合は1、有効でない場合は0、エラーの場合は-1
inet_ntop:数値フォーマット------ポイント10進数
戻り値:成功した場合は構造へのポインタ、エラーの場合はNULL
setsockopt
任意のタイプ、任意のステータススリーブインタフェースの設定オプション値.オプションは異なるプロトコル・レイヤに存在しますが、この関数では、最も高いソケット階層のオプションのみが定義されます.
sockfd:ソケットインタフェースを設定する記述語.level:オプションが存在するプロトコル・レイヤ.サポートSOL_SOCKET、IPPROTO_TCP、IPPROTO_IPとIPPROTO_IPV 6 optname:設定するオプション名.optval:保存オプションが設定される新しい値のバッファを指します.optlen:optvalバッファ長
戻り値:エラーが発生しない場合、setsockopt()は0を返します.
そうでなければSOCKET_に戻りますERRORエラー、アプリケーションはWSAGEtLastError()を使用して対応するエラーコードを取得できます.
エラーコード:
WSANOTINTIALISED:このAPIを使用する前に、WSAstartup()を正常に呼び出す必要があります.
WAENETDOWN:ソケットインタフェースはネットワークサブシステムの失効を検出することを実現する.
WAEFAULT:optvalはプロセスアドレス空間の有効な部分ではありません.
WAEINPROGRESS:ブロックされたソケット呼び出しが実行中です.
WAEINVAL:level値が不正、またはoptvalの情報が不正です.
WSINETRESET:SO_KEEPALIVE設定後接続タイムアウト.
WSINOPROTOOPT:不明またはサポートされていないオプション.そのうち、SOCK_STREAMタイプのソケットはSO_をサポートしていませんBROADCASTオプション、SOCK_DGRAMタイプのソケットはSO_をサポートしていませんDONTLINGER 、SO_KEEPALIVE、SO_LINGERとSO_OOBINLINEオプション.
WAENOTCONN:SO_を設定するとKEEPALIVE後に接続がリセットされます.
WAENOTSOCK:記述語は一連のインタフェースではありません.
bind()
ローカルアドレスをインタフェースセットにバンドルします.この関数は、connect()またはlisten()呼び出し前に使用される未接続のデータ・レポートまたはストリーム・クラス・スイート・インタフェースに適用されます.
ソケット()でソケットインタフェースを作成すると、名前空間(アドレスファミリー)に存在しますが、名前は付けられません.bind()関数は、名前のないソケットにローカル名を割り当てることで、ソケットにローカルバンドル(ホストアドレス/ポート番号)を確立します.
sockaddr:バンドルされていないインタフェースを識別する記述語
sockaddr:ソケットインタフェースに付与されたアドレス
addrlen: my_addrの長さ.
戻り値:エラーが発生しない場合bind()は0を返します.そうでなければ、-1が返され、アプリケーションはWSAGEtLastError()を介して対応するエラーコードを取得できます.
connect()
connect()は、指定したsocketとの接続を確立するために使用されます.
戻り値:成功すると0、失敗すると-1を返します.
recvfrom
ソケットインタフェースからデータを受信し、データ送信元のアドレスを取得します.
ssize_tはlong intに相当する
socket_tはintに相当する
戻り値:戻り受信バイト数を正しく受信し、失敗して-1を返す.
パラメータflags:次の1つ以上のフラグのコンビネーションは、"|"オペレータで接続できます.
MSG_DONTWAIT:操作がブロックされない.
MSG_ERRQUEUE:ソケットのエラーキューからエラー値を受信すべきであることを示し、異なるプロトコルに基づいて、エラー値は何らかの補佐的なメッセージで伝達され、使用者は十分なバッファを提供すべきである.エラーの原因となる元のパッケージはmsg_を通過します.iovecは一般的なデータとして伝達される.エラーが発生したデータはmsg_として元のターゲットアドレスに報告されます.nameが提供されます.エラーはsock_extended_Err構造形態は以下のように定義されている.
#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
MSG_PEEK:データ受信後、元のデータを受信キューに保持し、削除しないことを示し、その後の読み出し操作で同じデータを受信することもできます.
MSG_TRUNC:提供されるバッファよりも長い場合でも、パッケージの実際の長さを返します.packetソケットにのみ有効です.
sendto()
接続が確立されていないUDPパケット(パラメータSOCK_DGRAM)の送信に適した、指定された宛先へのデータの送信を指す.
文書ディレクトリ
WSADATA
WSAstartup関数によって呼び出された後に返される[Windows Sockets](https://baike.baidu.com/item/WindowsSockets)データ.Winsockが含まれていますdllが実行するデータ.
WAS(Windows Sockets Asynchronous、Windows非同期ソケット)
WSAstartup関数で呼び出されたWindows Socketsデータを格納します.Winsockが含まれていますdllが実行するデータ.
typedef struct WSAData {
WORD wVersion; // ,
WORD wHighVersion;// Windows Sockets
#ifdef _WIN64
unsigned short iMaxSockets;// socket
unsigned short iMaxUdpDg;
// (UDP) ,
char FAR * lpVendorInfo;
char szDescription[WSADESCRIPTION_LEN+1];//WinSockets
char szSystemStatus[WSASYS_STATUS_LEN+1];//
#else
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short MaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
#endif
} WSADATA;
WSAStartup
int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );
WSAstartup関数でWinsockサービスの初期化を完了し、Socketを使用する前にWSAstartup関数を呼び出す必要があります.
wVersionRequested:プログラムが使用を要求したSocketバージョンを示します.上位バイトがサブバージョン、下位バイトがプライマリバージョンを示すWORD(2バイト)型の数値
lpWsadata要求されたSocketのバージョン情報を返すためのWsadatAデータ構造へのポインタ
例:
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) /*MAKEWORD(2,2) WINSOCK2 .wsd WINSOCK .*/
{
cout << "WSAStartup Error = " << WSAGetLastError() << "
";
return;
}
MAKEWORD():符号なし16ビット整数を作成し、2つの与えられた符号なしパラメータを接続する
WORD MAKEWORD(
BYTE bLow, //
BYTE bHigh // ;
);
socket
lpWSAdata:Windows Sockets実装の詳細を受信するためのWSADATAデータ構造へのポインタ
socket
#include
#include
SOCKET socket(int af, int type, int protocol);
af:アドレスファミリー(Address Family)、すなわちIPアドレスタイプであり、よく使われるのはAF_INETとAF_INET6.
INETは「Inetnet」の略です.AF_INETはIPv 4アドレスを表す.AF_INET 6は、1110::A 0 B 3:FA 21:48 AA:1 A 2 BのようなIPv 6アドレスを表す.
type:データ転送方式/ソケットタイプで、よく使われるSOCK_STREAM(ストリームフォーマットソケット/接続向けソケット)とSOCK_DGRAM(データ・レポート・ソケット/接続されていないソケット)
protocol:転送プロトコルを表し、よく使われるIPPROTO_TCP(TCP転送プロトコル)およびIPPTOTO_UDP(UDPトランスポートプロトコル).
戻り値:SOCKETタイプのハンドル
sockaddr
struct sockaddr
{
unsigned short sa_family; // AF
char sa_data[14]; //14
};
sa_を指定するとfamily=AF_INETの後、sa_dataの形式も固定されている:最先端の2バイトは16ビットのポートを記録し、続いて4バイトは32ビットのIPアドレスを記録し、最後の8バイトはゼロにクリアされる.
sockaddr_in
struct sockaddr_in
{
unsigned short sin_family; //
unsigned short sin_port; //
struct in_addr sin_addr;// IP , in_addr
char sin_zero[8];//
};
sin_zero:sockaddrとsockaddrをin 2つのデータ構造が同じサイズで保持される空のバイト
struct in_addr
{
unsigned long s_addr;
};
inet_pton
inet_ptonはIPアドレス変換関数で、IPアドレスを「ポイント10進数」と「バイナリ整数」の間で変換でき、inet_ptonとinet_ntopの2つの関数はipv 4とipv 6を処理することができる.
pとnはそれぞれ表現(presentation)と数値(numeric)を表す
#include
int inet_pton(int af, const char *src, void *dst); -----
af:アドレスクラスタ
src:ソースアドレス
dst:変換後のデータを受信します.
戻り値:成功した場合は1、有効でない場合は0、エラーの場合は-1
inet_ntop:数値フォーマット------ポイント10進数
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len); // ip
戻り値:成功した場合は構造へのポインタ、エラーの場合はNULL
setsockopt
任意のタイプ、任意のステータススリーブインタフェースの設定オプション値.オプションは異なるプロトコル・レイヤに存在しますが、この関数では、最も高いソケット階層のオプションのみが定義されます.
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
sockfd:ソケットインタフェースを設定する記述語.level:オプションが存在するプロトコル・レイヤ.サポートSOL_SOCKET、IPPROTO_TCP、IPPROTO_IPとIPPROTO_IPV 6 optname:設定するオプション名.optval:保存オプションが設定される新しい値のバッファを指します.optlen:optvalバッファ長
戻り値:エラーが発生しない場合、setsockopt()は0を返します.
そうでなければSOCKET_に戻りますERRORエラー、アプリケーションはWSAGEtLastError()を使用して対応するエラーコードを取得できます.
エラーコード:
WSANOTINTIALISED:このAPIを使用する前に、WSAstartup()を正常に呼び出す必要があります.
WAENETDOWN:ソケットインタフェースはネットワークサブシステムの失効を検出することを実現する.
WAEFAULT:optvalはプロセスアドレス空間の有効な部分ではありません.
WAEINPROGRESS:ブロックされたソケット呼び出しが実行中です.
WAEINVAL:level値が不正、またはoptvalの情報が不正です.
WSINETRESET:SO_KEEPALIVE設定後接続タイムアウト.
WSINOPROTOOPT:不明またはサポートされていないオプション.そのうち、SOCK_STREAMタイプのソケットはSO_をサポートしていませんBROADCASTオプション、SOCK_DGRAMタイプのソケットはSO_をサポートしていませんDONTLINGER 、SO_KEEPALIVE、SO_LINGERとSO_OOBINLINEオプション.
WAENOTCONN:SO_を設定するとKEEPALIVE後に接続がリセットされます.
WAENOTSOCK:記述語は一連のインタフェースではありません.
bind()
ローカルアドレスをインタフェースセットにバンドルします.この関数は、connect()またはlisten()呼び出し前に使用される未接続のデータ・レポートまたはストリーム・クラス・スイート・インタフェースに適用されます.
ソケット()でソケットインタフェースを作成すると、名前空間(アドレスファミリー)に存在しますが、名前は付けられません.bind()関数は、名前のないソケットにローカル名を割り当てることで、ソケットにローカルバンドル(ホストアドレス/ポート番号)を確立します.
#include
int PASCAL FAR bind( SOCKET sockaddr, const struct sockaddr FAR* my_addr,int addrlen);
sockaddr:バンドルされていないインタフェースを識別する記述語
sockaddr:ソケットインタフェースに付与されたアドレス
addrlen: my_addrの長さ.
戻り値:エラーが発生しない場合bind()は0を返します.そうでなければ、-1が返され、アプリケーションはWSAGEtLastError()を介して対応するエラーコードを取得できます.
connect()
connect()は、指定したsocketとの接続を確立するために使用されます.
int connect(SOCKET s, const struct sockaddr * name, int namelen);
戻り値:成功すると0、失敗すると-1を返します.
recvfrom
ソケットインタフェースからデータを受信し、データ送信元のアドレスを取得します.
ssize_t recvfrom (int sockfd, //
void *buf, //
size_t len, //
unsigned int flags, //
struct sockaddr *from, // ( )
socket_t *fromlen); // from ( )
ssize_tはlong intに相当する
socket_tはintに相当する
戻り値:戻り受信バイト数を正しく受信し、失敗して-1を返す.
パラメータflags:次の1つ以上のフラグのコンビネーションは、"|"オペレータで接続できます.
MSG_DONTWAIT:操作がブロックされない.
MSG_ERRQUEUE:ソケットのエラーキューからエラー値を受信すべきであることを示し、異なるプロトコルに基づいて、エラー値は何らかの補佐的なメッセージで伝達され、使用者は十分なバッファを提供すべきである.エラーの原因となる元のパッケージはmsg_を通過します.iovecは一般的なデータとして伝達される.エラーが発生したデータはmsg_として元のターゲットアドレスに報告されます.nameが提供されます.エラーはsock_extended_Err構造形態は以下のように定義されている.
#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
MSG_PEEK:データ受信後、元のデータを受信キューに保持し、削除しないことを示し、その後の読み出し操作で同じデータを受信することもできます.
MSG_TRUNC:提供されるバッファよりも長い場合でも、パッケージの実際の長さを返します.packetソケットにのみ有効です.
sendto()
接続が確立されていないUDPパケット(パラメータSOCK_DGRAM)の送信に適した、指定された宛先へのデータの送信を指す.
int sendto(
int s, // socket, UDP
const void * msg, //
int len, //msg
unsigned int flags, // 0
const struct sockaddr * to, //sockaddr
int tolen //sockaddr
);