TCP 통신 메커니즘, 전이중의 형태로 클라이언트와 서버 사이의 링크 (송신 될 수있는 데이터, 또한 데이터를 수신 할 수있다),이 처리가 수행되지 않는 안정적인 데이터 전송 (데이터 송수신 인 "컴퓨터 네트워크 - 하향식 (top-down)", UDP 왜 신뢰할 수있는 전송의 세부 사항으로하지 않습니다) 손실됩니다, 참조, 다음과 같은 코드가 C 구현 모델에 사용된다 ++
1.TCP ------ 서버
(비활성화 : 4996)의 #pragma 경고, 사용법 #include <iostream> 사용법 #include <winsock2.h> 사용법 #include <WINDOWS.H> 사용하여 네임 스페이스 성병; #pragma 주석 (lib, "ws2_32.lib") 클래스 TCP { 공개 : 무효 check_version (); 보이드 intintail (); () blind_listen 무효화; 보이드 sent_recv (); 개인 : WSADATA 데이터; 소켓의 sock_server; 소켓의 sock_client; 를 sockaddr_in add_server; 를 sockaddr_in ADD_CLIENT; }; () 주요 int로 { TCP를들 a a.check_version (); a.intintail (); a.blind_listen (); a.sent_recv (); } 보이드 :: check_version하는 TCP () { // = INT RET을 WSAStartup (MAKEWORD (2,2), 데이터), IF (!을 WSAStartup (MAKEWORD (2,2), 데이터) = 0) { COUT << "소켓 단어의 잘못된 버전 "<< 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 () {N = INT는 sizeof (를 sockaddr_in) = INT RET 바인드 (sock_server (LPSOCKADDR) add_server, N) 경우 (RET == SOCKET_ERROR) {COUT은 << "귀속 소켓 실패한 "<< ENDL; WSACleanup을 ()한다} else {COUT <<"바인드 소켓 성공 "<< ENDL가} // 소켓 INT RET2 = 청취 청취를 시작 (sock_server 10) // 제 미완성 큐 및 큐 파라미터 결정이 완료되었는지의 합의 최대 연결 번호 (RET2 == SOCKET_ERROR) {COUT << << ENDL "모니터 실패"; WSACleanup을 ()한다} else {COUT << "모니터 성공" << endl의;}} 무효 TCP :: sent_recv () {cout을 << << "링크를 클라이언트로 준비하고있다"<< "\ t"을 "기다려주십시오 ..."<< endl의 슬립 (3000); 동안 (TRUE) {INT LEN =를 sizeof (SOCKADDR) // 먼저 클라이언트 sock_client 연결 = 동의했다 (sock_server (LPSOCKADDR를) ADD_CLIENT, 렌) 경우 (sock_client == SOCKET_ERROR) {COUT << "연결 실패"<< ENDL;를 WSACleanup을 ();사용한다} else {COUT << "성공적인 링크"<< ENDL을; 침입 // 숯 빼앗아 송신} 및 수신 데이터 [100] = "안녕하세요 클라이언트"; 경우 (송신 (sock_client, SER, 100, 0) == SOCKET_ERROR) 다른 {cout과는 << << endl의 "를 성공적으로 전송";} {; WSACleanup을 (); 휴식을 cout과는 << endl의 << "전송 실패"}}}
2TCP ----- 클라이언트
의 #pragma 경고 (해제 : 4996); 사용법 #include <iostream> 네임 스페이스를 사용하여 표준; 사용법 #include <winsock2.h> 의 #pragma 주석 (lib 디렉토리, "ws2_32.lib") 사용법 #include <WINDOWS.H> 클래스 TCP { 공개 : 무효 intalize (); 보이드 my_connect (); 보이드 my_recv (); 개인 : 소켓의 sock_client; 를 sockaddr_in addr_server; 를 sockaddr_in client_ADDR; WSADATA 데이터; 공개 : 숯 촬영 [100]; //接受并且进行打印的数组 INT 렌; }; () 주요 int로 { TCP를들 a a.intalize (); a.my_connect (); a.my_recv (); } 무효 TCP :: intalize () { IF (!을 WSAStartup (MAKEWORD (2, 2), 데이터) = 0) { ; COUT은 << << ENDL "잘못된 버전 소켓" WSACleanup을가 (); } 다른 { COUT << "소켓 정확한 버전" ENDL <<; } memset 함수 (addr_server, 0, sizeof의 (addr_server)); sock_client = 소켓 (AF_INET는, SOCK_STREAM, 0), IF는 (== INVALID_SOCKET는 sock_client이다) { ; COUT << "설정 실패"<< ENDL WSACleanup을 () ; } 다른 { COUT << "성공적인 세트"<< 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 () { 경우 (연결 (sock_client (LPSOCKADDR) addr_server 렌) == SOCKET_ERROR) { COUT << "连接失败"<< ENDL; WSACleanup을 (); } 다른 { COUT << "连接成功"<< ENDL; } } 무효 TCP :: my_recv을 () { 경우 (RECV (sock_client, REC, 1,0) == SOCKET_ERROR) { COUT << "接收失败"<< ENDL; WSACleanup을 (); } 다른 { COUT << COUT은 << "정보 서버는 다음과 같습니다"<< endl의 << REC; } }
【말】
(비활성화 : 4996)의 #pragma 경고를 추가 할 경우합니다 inet_addr () vs2017에서 호출 vs2019를 들어, 오류 것 때문에 문제의 버전