Windowsネットワークプログラミング学習ノート(3)TCPサービスを作成する
3928 ワード
通信は接続向け通信(接続接続-oriented Communication、例えばTCP)に分けられる
UDPなどの非接続通信(Connectionless Communication).メモ(3)からメモ(6)まで前者を紹介します.
この章では、顧客接続要求を受信するためにWinsock TCP/IPサービスを作成する方法について説明します.
SOCKETはWinsockで独立したタイプです
定義は次のとおりです.
typedef UINT_PTR SOCKET; typedef _W64 unsigned int UINT_PTR, *PUINT_PTR; 接続を表すハンドル.
Winsockには、接続転送モード向け、無接続転送モードの2つの基本通信方式がある.
IPプロトコルファミリーの中で、TCP/IPプロトコルは接続通信に向いて、TCPはゼロエラーデータ伝送メカニズムを提供して、送信側と受信側で1本の仮想的な接続を創立する.
サービス側は、複数の顧客が接続し、それに対応する要求を待つプロセスです.サービス側は1つの周知のアドレス上で接続を傍受し、TCP/IPの中で、周知のポートはローカルインタフェースのIPアドレスとポート番号である.異なるプロトコルには異なるアドレス構成方式があるため、異なるアドレス命名方法がある.
サービス・エンドを確立するには
1.socket()/WSASocket();//socketを作成する2.bind();//周知の住所をバインドする.3.listen();//傍受モードを設定する.4.accept()/WSAAccept();//接続を受信する.
1.socket()/WSASocket();//socketを作成するSocketを作成する方法は2つあります:socket()、WSASOcket()です.SOCKET socket( int af, int type, int protocol ); int af:アドレスの説明です.現在はAFのみサポートされていますINET形式、つまりARPAインターネットアドレス形式.int type:socketタイプを指定します.TCP(SOCK_STREAM)およびUDP(SOCK_DGRAM)のような新しいインタフェースのタイプ記述タイプ.よく使うソケットタイプは、SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQACK ETなど.int protocol:名前の通り、プロトコルを指定します.ソケットインタフェースで使用されるプロトコル.呼び出し元が指定したくない場合は、0を使用します.よく使われるプロトコルは、IPPROTO_です.TCP、IPPROTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等は、TCPトランスポートプロトコル、UDPトランスポートプロトコル、STCPトランスポートプロトコル、TIPCトランスポートプロトコルにそれぞれ対応する.Winsockは、setsockopt()、getsockopt()、ioctlsocket()、Wsaoctl()の4つの有用な関数を提供する.詳細は後述する.2.bind();//周知の住所をバインドする.int bind(SOCKET s,//サービス側socket const struct sockaddr FAR*name,//SockKADDR int namelen//name長);使用コードは以下の通りである:SOCKET s;SOCKADDR_IN InternetAddr; s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//socket INT nPortID=5150を作成する.InternetAddr.sin_family=AF_INET; InternetAddr.sin_addr.s_addr=htonl(INADDR_ANY); //INADDR_ANYパラメータは、サービス側が任意のアドレスからそのポートへ送信メッセージInternetAddrを受信ことを示す.sin_port=htons(nPortID); bind(s,(SOCKADDR*)&InternetAddr,sizeof(InternetAddr));//明示的な変換エラー時にSOCKET_を返すERROR. 一般的なエラーコード:WAEADDRINESE:IPポートが占有されているかTIME_WAIT状态WAEFAULT:バインド後にもう一度バインド.3.listen();//傍受モードを設定する.int listen(SOCKET s,int backlog//接続キューの最大長);backlogパラメータを設定後も、プログラムの最下位レベルで適切な近接値に置き換える必要があり、ユーザは正確な値を知ることができない.一般的には5.保留中のキューがいっぱいになった場合、接続要求は失敗し、WAECONNREFUSEDに戻ります.一般的なエラーコード:WAEADDRINESE:IPポートが占有されているかTIME_WAIT状态WAEFAULT:listen()の前にbind()を行う.4.accept()/WSAAccept();//接続を受信する.実はAcceptEx()関数もあります.accept()の拡張です.後で紹介します.SOCKET accept(socket s,//リスニング状態バインドsocket struct sockaddr FAR*addr,//有効なSOCKADDR_INアドレスint FAR*addrlen//SockKADDR_INの長さ);この関数は、接続を要求する顧客に関連付けられたsocket記述子を返し、このsocketを使用して後続の一連の操作を行う.サービス側の傍受socketは、他の顧客の要求を傍受するために継続的に存在する.エラーが発生した場合、INVALID_に戻ります.SOCKETエラー一般的なエラーコード:WAEWOULDBLOCK:非同期または非ブロックモードでsocketをリスニングし、接続なしで許容する.
完全なWinsock TCP/IPサービス・エンド・コード(エラー処理部分を簡潔に削除するため)は、次のとおりです.
注意accept()関数の最後のパラメータは、明示的にサイズを指定する必要があります.
ClientAddrLesizeof(ClientAddr);//ClientAddrLenサイズを明示的に指定
Winsock TCP/IPサービスを作成して、お客様の接続要求を受信することができます.
UDPなどの非接続通信(Connectionless Communication).メモ(3)からメモ(6)まで前者を紹介します.
この章では、顧客接続要求を受信するためにWinsock TCP/IPサービスを作成する方法について説明します.
SOCKETはWinsockで独立したタイプです
定義は次のとおりです.
typedef UINT_PTR SOCKET; typedef _W64 unsigned int UINT_PTR, *PUINT_PTR; 接続を表すハンドル.
Winsockには、接続転送モード向け、無接続転送モードの2つの基本通信方式がある.
IPプロトコルファミリーの中で、TCP/IPプロトコルは接続通信に向いて、TCPはゼロエラーデータ伝送メカニズムを提供して、送信側と受信側で1本の仮想的な接続を創立する.
サービス側は、複数の顧客が接続し、それに対応する要求を待つプロセスです.サービス側は1つの周知のアドレス上で接続を傍受し、TCP/IPの中で、周知のポートはローカルインタフェースのIPアドレスとポート番号である.異なるプロトコルには異なるアドレス構成方式があるため、異なるアドレス命名方法がある.
サービス・エンドを確立するには
1.socket()/WSASocket();//socketを作成する2.bind();//周知の住所をバインドする.3.listen();//傍受モードを設定する.4.accept()/WSAAccept();//接続を受信する.
1.socket()/WSASocket();//socketを作成するSocketを作成する方法は2つあります:socket()、WSASOcket()です.SOCKET socket( int af, int type, int protocol ); int af:アドレスの説明です.現在はAFのみサポートされていますINET形式、つまりARPAインターネットアドレス形式.int type:socketタイプを指定します.TCP(SOCK_STREAM)およびUDP(SOCK_DGRAM)のような新しいインタフェースのタイプ記述タイプ.よく使うソケットタイプは、SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQACK ETなど.int protocol:名前の通り、プロトコルを指定します.ソケットインタフェースで使用されるプロトコル.呼び出し元が指定したくない場合は、0を使用します.よく使われるプロトコルは、IPPROTO_です.TCP、IPPROTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等は、TCPトランスポートプロトコル、UDPトランスポートプロトコル、STCPトランスポートプロトコル、TIPCトランスポートプロトコルにそれぞれ対応する.Winsockは、setsockopt()、getsockopt()、ioctlsocket()、Wsaoctl()の4つの有用な関数を提供する.詳細は後述する.2.bind();//周知の住所をバインドする.int bind(SOCKET s,//サービス側socket const struct sockaddr FAR*name,//SockKADDR int namelen//name長);使用コードは以下の通りである:SOCKET s;SOCKADDR_IN InternetAddr; s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//socket INT nPortID=5150を作成する.InternetAddr.sin_family=AF_INET; InternetAddr.sin_addr.s_addr=htonl(INADDR_ANY); //INADDR_ANYパラメータは、サービス側が任意のアドレスからそのポートへ送信メッセージInternetAddrを受信ことを示す.sin_port=htons(nPortID); bind(s,(SOCKADDR*)&InternetAddr,sizeof(InternetAddr));//明示的な変換エラー時にSOCKET_を返すERROR. 一般的なエラーコード:WAEADDRINESE:IPポートが占有されているかTIME_WAIT状态WAEFAULT:バインド後にもう一度バインド.3.listen();//傍受モードを設定する.int listen(SOCKET s,int backlog//接続キューの最大長);backlogパラメータを設定後も、プログラムの最下位レベルで適切な近接値に置き換える必要があり、ユーザは正確な値を知ることができない.一般的には5.保留中のキューがいっぱいになった場合、接続要求は失敗し、WAECONNREFUSEDに戻ります.一般的なエラーコード:WAEADDRINESE:IPポートが占有されているかTIME_WAIT状态WAEFAULT:listen()の前にbind()を行う.4.accept()/WSAAccept();//接続を受信する.実はAcceptEx()関数もあります.accept()の拡張です.後で紹介します.SOCKET accept(socket s,//リスニング状態バインドsocket struct sockaddr FAR*addr,//有効なSOCKADDR_INアドレスint FAR*addrlen//SockKADDR_INの長さ);この関数は、接続を要求する顧客に関連付けられたsocket記述子を返し、このsocketを使用して後続の一連の操作を行う.サービス側の傍受socketは、他の顧客の要求を傍受するために継続的に存在する.エラーが発生した場合、INVALID_に戻ります.SOCKETエラー一般的なエラーコード:WAEWOULDBLOCK:非同期または非ブロックモードでsocketをリスニングし、接続なしで許容する.
完全なWinsock TCP/IPサービス・エンド・コード(エラー処理部分を簡潔に削除するため)は、次のとおりです.
int main(void)
{
WSADATA wsaData;
SOCKET ListeningSocket;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int port=5150;
int ClientAddrLen;
WSAStartup(MAKEWORD(2,2),&wsaData); // Winsock 2.2
ListeningSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); // socket
ServerAddr.sin_family=AF_INET; // SOCKADDR_IN
ServerAddr.sin_port=htons(port);
ServerAddr.sin_addr.s_addr=htonl(ADDR_ANY);
bind(ListeningSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr)); //
listen(ListeningSocket,5); //
ClientAddrLesizeof(ClientAddr); // ClientAddrLen
NewConnection=accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen);
// , ! !
// socket
//1. ListeningSocket accept()
//2. NewConnection /
// socket
//socket
closesocket(ListeningSocket); // ListeningSocket
closesocket(NewConnection); // NewConnection
WSACleanup(); // Winsock
return 0;
}
注意accept()関数の最後のパラメータは、明示的にサイズを指定する必要があります.
ClientAddrLesizeof(ClientAddr);//ClientAddrLenサイズを明示的に指定
Winsock TCP/IPサービスを作成して、お客様の接続要求を受信することができます.