TCP通信機構、全二重の形でクライアントとサーバの間のリンク(送信され得るデータ、さらにデータを受信することができる)、この処理は実行されない信頼性の高いデータ伝送(データの送受信であります「コンピュータネットワーク - トップダウン」、UDPはなぜ信頼性の高い伝送の詳細などはありません)失われます、を参照してください、次のコードは、C実装モデルで使用されている++
1.TCP ------サーバー
#pragma警告(無効:4996); 書式#include <iostreamの> 書式#include <winsock2.h> 書式#include <WINDOWS.H> 名前空間stdを使用。 #pragmaコメント(libに、 "WS2_32.LIB") クラスTCP { 公衆: 空check_version(); 空intintail(); 空blind_listen(); 空sent_recv(); 民間: WSAD日。 SOCKETのsock_server。 SOCKETのsock_client。 SOCKADDR_INのadd_server。 SOCKADDR_INのadd_client。 }。 メインint型() { TCPのA; a.check_version(); a.intintail(); a.blind_listen(); a.sent_recv(); } 無効TCP :: check_version() { // int型RET = WSAStartupの(MAKEWORD(2,2)、およびデータ)。 (WSAStartupの(MAKEWORD(2,2)、およびデータ)!= 0)の場合 { 裁判所未満<<「ソケットバージョンエラー」<<てendl; WSACleanup(); } そうしないと { COUTは<< << ENDL「ソケットのバージョンが正しいですか」。 } } 無効TCP :: intintail() { 設定//ソケットインタフェース sock_server =ソケット(AF_INET、SOCK_STREAM、0); //設定された構成アドレス add_server.sin_family = AF_INET; add_server.sin_port = htons()。 add_server.sin_addr.S_un.S_addr =のinet_addr( ""); // IPアドレスを記入
}ボイドTCP :: blind_listen(){int型N =はsizeof(SOCKADDR_IN); int型RET =バインド(sock_server、(LPSOCKADDR)&add_server、N);(RET == SOCKET_ERROR){COUT <<「バインドソケットが失敗した場合"<<てendl; WSACleanup();}他{裁判所未満<<" バインドソケット成功「<<てendl;} //ソケットint型RET2 =(sock_server、10)を聞くリスニングを開始; // 2番目の未完成のキューとキューパラメータ決定が完了している場合の合計の最大接続数(RET2 == SOCKET_ERROR){COUT << << ENDL「モニター失敗」; WSACleanup();}他{COUT <<「モニター成功」 <<てendl;}}無効TCP :: sent_recv(){coutの<< << "リンククライアントに準備している" << "\ tで" "しばらくお待ちください" <<てendl;スリープ(3000);ながら、 (真){int型のlen =はsizeof(SOCKADDR); //最初のクライアントsock_clientをリンク=受け入れるようになった(sock_server、(LPSOCKADDRを)&add_client、&LEN);場合(sock_client == SOCKET_ERROR){coutの<< "リンク障害" << ENDL; WSACleanup();ブレーク;}他{COUT << "成功した" リンク<< ENDL;} //チャーSERの送信およびデータを受信する[100] = "ハロークライアント"(送信(sock_client、SER、100、0)== SOCKET_ERROR)場合{COUT << "送信失敗" << ENDL; WSACleanup();ブレーク;}他{COUTは<< "正常に送信され、" << ENDL;}}}
2TCP -----クライアント
#pragma警告(無効:4996); 書式#include <iostreamの> 名前空間stdを使用。 書式#include <winsock2.h> #pragmaコメント(libに、 "WS2_32.LIB") 書式#include <WINDOWS.H> クラスTCP { 公衆: 空intalize(); 空my_connect(); 空my_recv(); 民間: SOCKETのsock_client。 SOCKADDR_INのaddr_server。 SOCKADDR_IN CLIENT_ADDR; WSAD日。 公共:チャーREC [100]; //受信するためのアレイと印刷 lenはint型。 }。 メインint型() { TCPのA; a.intalize(); a.my_connect(); a.my_recv(); } 無効TCP :: intalize() { (WSAStartupの(MAKEWORD(2、2)、およびデータ)!= 0)の場合 { 裁判所未満<<「ソケットバージョンエラー」<<てendl; WSACleanup(); } そうしないと { COUTは<< << ENDL「ソケットのバージョンが正しいですか」。 } memset(&addr_server、0、はsizeof(addr_server))。 sock_client =ソケット(AF_INET、SOCK_STREAM、0); もし(sock_client == INVALID_SOCKET) { 裁判所未満<<「の設定に失敗しました」<<てendl; WSACleanup(); } そうしないと { 裁判所未満<< "正常に設定" <<てendl; } addr_server.sin_family = AF_INET; addr_server.sin_port = htons(); //コンピュータの任意のポートを選択 addr_server.sin_addr.S_un.S_addr =のinet_addr( ""); // IPアドレスを記入 LEN =はsizeof(SOCKADDR_IN)。 } 無効TCP :: my_connect() { もし(CONNECT(sock_client、(LPSOCKADDR)&addr_server、LEN)== SOCKET_ERROR) { coutの<< <<てendl "接続に失敗しました"。 WSACleanup(); } そうしないと { 裁判所未満<< "正常に接続" <<てendl; } } 無効TCP :: my_recv() { もし(RECV(sock_client、REC、1,0)== SOCKET_ERROR) { 裁判所未満<< "受信失敗" <<てendl; WSACleanup(); } そうしないと { 裁判所未満<< "受信成功" <<てendl; COUTは<< "Information Serverがある:" << REC <<てendl; } }
【リマーク】
(無効:4996)の#pragma警告を追加しない場合のinet_addr()vs2017で呼び出し、vs2019のため、エラーになりますので、問題のバージョン