ソケットプログラム(TCP,UDP) EasyChat開発
ソケットプログラム ネットワークプログラミングの基礎にあたる バークレーソケットが原型 使用するのはWinSock(WS2_32.dll)。
2種類の接続方式 TCP/IPプロトコルには、接続型(コネクション型)と非接続型(コネクションレス型)という2種類のネットワーク通信があります。 接続型にはTCP(ストリームソケット),非接続型にはUDP(データグラムソケット)を用いる。
接続型(TCP) 持続的に接続されている。 高い信頼性をもった通信が可能 データ通信の順序どおりに通信可能 未完成のパケットを通信する 通信速度は遅め
非接続型(UDP) 継続的に接続せず、必要があるときだけ接続する。 信頼性が無い。 完成されたパケットを送る 通信順序はバラバラ 通信速度は高速
EasyChat 接続型はTCPを使う。 1:1の通信のみ サーバー、クライアント両方の機能を持ち合わせたものにする 暗号化や効率化は考えず、あくまでも一番単純な形で実装する。
ソケットの使用 WS2_32.dllの呼び出し ソケット初期化 接続 ソケットオプション設定 //WS2_32.dll if(WSAStartup(MAKEWORD(2,2),&wsadate)==SOCKET_ERROR){ return 1; } //socket my_socket=socket(AF_INET,SOCK_STREAM,0); if(my_socket==INVALID_SOCKET){ return 2; //connect re= connect(my_socket,(SOCKADDR*)&address,sizeof(SOCKADDR_IN)); if(re){ return 3; //option optval=SO_SEC_SSL; setsockopt(my_socket,SOL_SOCKET,SO_SECURE,(char*)&optval,sizeof(optval)); ソケット初期化 接続 ソケットオプション設定
TCP接続(サーバー) WS2_32.dllの呼び出し ソケット初期化 BIND(ソケットとポート連結) LISTEN //WS2_32.dll if(WSAStartup(MAKEWORD(2,2),&wsadate)==SOCKET_ERROR){ return 1; } //socket address_in.sin_addr.s_addr=inet_addr(ip); mt_socket=socket(AF_INET,SOCK_STREAM,0); if(my_socket==INVALID_SOCKET){ return 2; //bind if(bind(socket(struct aockaddr *)&address_in,sizeof(address_in)) ==SOCKET_ERROR) { return 3; //listen if(listen(socket,SOMAXCONN)==SOCKET_ERROR){ return 4; client_socket=INVALID_SOCKET; client_socket=accept(socket,(struct sockaddr*)&cs,&addresssize); WS2_32.dllの呼び出し ソケット初期化 BIND(ソケットとポート連結) LISTEN ACCEPT(接続待機)
EasyChat wait client でサーバーモードに。 最初に接続先(IP)を入力することでクライアント接続。
EasyChatのアルゴリズム ネットワークの初期化 (ソケット生成,bind) 接続待機 送信 Main関数ループ (ゲームループ) 受信スレッド (Worker Thread)
EasyChatを改良してUDPのchatプログラムも作りたい。 TCP、UDPの長所短所をよく理解してサーバー構築に生かしたい。 受信スレッドの無限ループが重いのでどうにかしたい。