소켓, 서버와 클라이언트의 대화

서버 :

_CRT_SECURE_NO_WARNINGS #DEFINE
사용법 #include <stdio.h에>
사용법 #include <문자열>
사용법 #include <winsock2.h> // 가장 높은 버전의 현재 시스템과 인터넷 라이브러리 버전 2.2
#pragma 주석 (lib, "Ws2_32.lib" ) // 로드 동적 링크 라이브러리 x32.x64이 ws2_32.lib의 버전을 사용하는
헤더 파일의 첫 번째 버전의 두 번째 버전은 위의 것은 // 개의 wsock32.lib WinSock.h의 동적 라이브러리
사용하여 네임 스페이스 표준;


주요 INT ()
{
/ * 호출 라이브러리 버전 2.1 오류 직접 할당 (짧은 정수로 WORD, 부동 소수점 2.1) 경우
메모리 MAKEWORD (2,1)에 저장소에 매크로를 사용은, 2 (258)로 변환된다 이진 000,100,000,010 인
헤드가 높은 메모리에 저장되기 때문에, 상위 바이트 0001 <저장된 하위 바이트에 저장 곧 주 버전 번호 (2) 비트 (8 개 비트를 1 바이트), 마이너 버전 번호, 먼저 데이터> * /
WORD의 m_versions = MAKEWORD (2,2); // MAKEWORD (A, B) 1 파라미터 마이너 버전 번호 파라미터 (2) 주 버전 번호된다
WSADATA의 M_DATA]에 의해 반환 된 정보를 수신 // 소켓

// *** *** 1 개 개방형 네트워크 라이브러리
INT 응답 = WSAStartup에 (m_versions, M_DATA); // 구문 분석 매개 변수 (21)는 현재 라이브러리 4 정보를 제공 할 수 있습니다 3 시스템 버전으로 사용 버전 2에 우리가 원하는 가장 높은 현재 소켓 또는 개방 상태를 초래

하는 경우 (대답! = 0) // 열기 실패 결과
{
스위치 (답)
{
케이스 WSASYSNOTREADY :
의 printf ( ". 따라 네트워크 트래픽의 네트워크 서브 시스템이 준비되지 않은")
BREAK;
WSAVERNOTSUPPORTED 케이스 :
printf와가 ( "현재의 시스템이 필요한 라이브러리 버전을 지원하지 않습니다.");
BREAK를,
케이스 WSAEINVAL을 :
printf와 ( "필요한 라이브러리 DLL의 현재 버전을 찾을 수 있습니다.")
BREAK를,
케이스 WSAEPROCLIM를 :
printf와을 ( "포트의 현재 수있다 "); 한도까지
BREAK,
케이스 WSAEINPROGRESS :
의 printf ("현재 초기화 기능이 차단된다 ");
BREAK,
케이스 WSAEFAULT :
의 printf ("현재 포인터 (파라미터 2) 무효 포인터 ");
BREAK;
}
}
(m_data.wVersion! = 514) // 버전 2.2의 경우 2.2는 단일 바이트 진수 514에 저장되어있는 버전 개방 실패, 즉
부재의 상위 바이트를 획득 {//HIBYTE(m_data.wVersion) (즉, 높은 버전 번호 ) LOBYTE는 () 멤버의 하위 바이트를 가져옵니다
WSACleanup을을 (); // 지정된 버전은 네트워크 라이브러리 끄기 열지 못했습니다
; 시스템 ( "PAUSE")
반환 0;
}

 


***이 *** // 각각의 반환 값에 대한 서버 소켓을 만들고 각 프로토콜의 특성을 나타내는 고유 값 TCP / IP 프로토콜 반환의 총 수입니다.
SOCKET m_ServerSocket = 소켓 (AF_INET, SOCK_STREAM , IPPROTO_TCP); // MFC 유사한 창 핸들, 포트 작업은 소켓의 값을 사용할 필요가
// 주소 매개 변수 유형 1 (IPV4 형식), 소켓 타입 (2) (순차 안정적 양방향 접속 기반 바이트 스트림) 프로토콜의 3 개 종류 (TCP 프로토콜 파라미터 대응 1이다.)

(== INVALID_SOCKET가 m_ServerSocket되어 있으면) 생성에 실패 //
{
INT m_ErrorNum WSAGetLastError = ();
의 printf ( "만들기 서버 소켓은, 오류 코드 실패 : % D \ N- ", m_ErrorNum);
// 지정된 버전은 네트워크 라이브러리 끄기 열지 못했습니다; WSACleanup을 ()
; PAUSE") 시스템 ( "
반환 0;
}

 

를 sockaddr_in m_ServerSocketaddr // 구조, 메모리 어드레스의 타입, 및 어드레스 포트 (를 sockaddr_in 및 SOCKADDR 구조로서 만, 전자는 파라미터 쉽게로 전달 쉽게 할당한다)
m_ServerSocketaddr.sin_family = AF_INET; // 동일한 유형의 주소 생성
m_ServerSocketaddr .sin_addr.S_un.S_addr = inet_addr은 ( "127.0.0.1") ; //는 127.0.0.1은 (어떤 PC)를 사용하지를 테스트 루프백 주소, IP 주소의 문자열이 저장되어있는 로컬 변환
m_ServerSocketaddr.sin_port = htons (12345); // 포트 번호는 호스트 바이트 순서로 변환하는 데 사용되어야하며, 포트 번호가 고유하고 바인드 반복 할 수 없습니다

주소를 @ 3 *** *** 해당 바인딩 (발견 컴퓨터) 및 (특정 응용 프로그램에 있음) 포트 번호
INT = m_bind 바인드 (m_ServerSocket, (SOCKADDR *) & m_ServerSocketaddr,는 sizeof (m_ServerSocketaddr));
IF // 생성 실패 (m_bind! = 0)
{
INT m_ErrorNum = WSAGetLastError ();
의 printf ( "바인드 오류 코드, 실패 : % D \ N- ", m_ErrorNum)
closesocket 함수 (m_ServerSocket),
WSACleanup을 ();
시스템 ("PAUSE ");
반환 0;
}

(즉, 클라이언트가 연결할 수 있도록 서버를 시작 유사) *** 4 *** // 리스너를 시작, 클라이언트 연결을 수신
INT = m_listen 청취 (m_ServerSocket, 5); // 서버 sockt. 연결 대기중인 큐의 최대 길이 SOMAXCONN 시스템이 자신의 적절한 수를 선택할 수 있습니다 (서버가 동시에 5를 처리 할 수있는 가정은, 8은 처리를 위해 대기중인 나머지, 지금에 와서)
경우 (m_listen! = 0) // 시작하지 못했습니다
{
m_ErrorNum WSAGetLastError = INT ();
의 printf ( "시작하는 데 실패, 오류 코드 : % D \ N-", m_ErrorNum)
closesocket 함수 (m_ServerSocket),
WSACleanup을 ();
시스템 ( "PAUSE");
반환 0;
}

 

를 sockaddr_in m_ClientSocketaddr 상기 단계 3 // 일관 클라이언트 데이터 구조에 저장
INT m_ClientLen =를 sizeof (m_ClientSocketaddr) // 사이즈 구조

5 *** // *** 연결을 허용. 클라이언트 커넥트가있는 경우, 서버는 2.3가 클라이언트 정보를 제공하지 NULL로 설정 될 수 있습니다 매개 변수 통신을 유지하기위한 소켓을 만들 수 있습니다.
SOCKET m_ClientSocket = 동의 (m_ServerSocket을합니다 (SOCKADDR *) & m_ClientSocketaddr, m_ClientLen을);
// accept 함수가 아래로 실행되지 않습니다, 차단 된 상태 (연결 대기)에서 왔으며의 번호로 여러 클라이언트 당신이주기에 필요한 연결 및 대응을 연결 만 할 수 있습니다 (그렇지 않으면 차단 된)

IF (m_ClientSocket == INVALID_SOCKET) // 반환 잘못된 소켓
{
m_ErrorNum INT WSAGetLastError = ();
의 printf ( "클라이언트 연결에 실패, 오류 코드 : % D \ N-", m_ErrorNum)
closesocket 함수 (m_ServerSocket),
WSACleanup을 ();
시스템 ( "PAUSE") ;
0 반환;
}
의 printf ( "성공적인 클라이언트 연결 \ n을");

A는 (5) = int로;
반면 (A! = 0, 장음)
{

클라이언트에 의해 전송 된 데이터 수신 // 6 ***
CHAR StoCbuf [1500] = 0 { //} 서버에 클라이언트를 기억하는 캐릭터 허용
INT A를 = sizeof의 (StoCbuf)
INT = m_ClientStrLen RECV 명을 (m_ClientSocket, StoCbuf,는 sizeof (StoCbuf ), 0); // 1 항상 차단 된 상태가됩니다 읽기 모드의 수 (0 기본값) 넣어에 저장되는 것입니다, 수용에서 sockt, 클라이언트 동작까지
(m_ClientStrLen == 0) 클라이언트가 오프라인 즉이다 // 경우
{
에서 printf ( "접속은 클라이언트가 오프라인 중단된다");
}
다른 IF (SOCKET_ERROR의 m_ClientStrLen이다 ==)
{
INT m_ErrorNum WSAGetLastError = ();
에서 printf ( " 데이터를 수신하는 클라이언트 오류 코드 실패 % D \ N- "m_ErrorNum)
BREAK;
}
다른
{
의 printf ("클라이언트 % S \ N- "StoCbuf)
}


*** *** 클라이언트에 7 개 // 송신 데이터
의 printf ( "서버 :");
얻는다 (StoCbuf),
(나 strlen m_ClientSocket, StoCbuf (StoCbuf), 0) INT m_ServerStrLen = 보내기를 소켓 // 객체 전송 송신 데이터 송신 모드의 데이터 길이
IF (SOCKET_ERROR의 m_ServerStrLen이다 ==)
{
m_ErrorNum WSAGetLastError = () INT;
인 printf ( "서버의 데이터 오류 코드를 전송 실패 % D \ N-"m_ErrorNum)
}
IF (= StoCbuf = "886")
BREAK;
}


// 사용 후 제 (함수 라이브러리 내부 네트워크의 함수 임), 그리고 가까운 네트워크 라이브러리 생성 된 소켓을 파괴
; closesocket 함수 (m_ServerSocket)
WSACleanup을 ();

시스템 ( "중지");
}

 

 

 

클라이언트 :

#DEFINE _CRT_SECURE_NO_WARNINGS
사용법 #include <stdio.h에>
사용법 #include <WinSock2.h>
의 #pragma 주석 (lib 디렉토리, "ws2_32.lib")

메인 INT ()
{
/ * 오픈 네트워크 라이브러리 * /
WORD m_versions MAKEWORD = (2,2); // MAKEWORD (A는, B)가 파라미터 (2) 주 버전 번호이고, 마이너 버전 번호 파라미터 1
WSADATA의 M_DATA //와 소켓에 반환 된 정보 수신
= WSAStartup에 (m_versions, M_DATA) INT 응답을,
IF (! 답 = 0) 열린 //로 실패의 결과
{
스위치 (답)
{
케이스 WSASYSNOTREADY :
의 printf는 ( "따라 네트워크 트래픽의 네트워크 서브 시스템은하지 않았습니다 준비 ");
BREAK;
케이스 WSAVERNOTSUPPORTED :
printf와 ("필요한 라이브러리의 현재 버전을 지원하지 않는 시스템 ");
BREAK;
케이스 WSAEINVAL :
printf와 ("필요한 DLL 라이브러리의 현재 버전 "); 찾을 수 없습니다
BREAK를,
케이스 WSAEPROCLIM :
]의 printf ( ". 현재 포트 번호가 한계에 도달")
; BREAK
: 케이스 WSAEINPROGRESS
( "현재 초기화 기능이 차단되어있다.")의 printf는,
BREAK,
케이스를 WSAEFAULT :
의 printf ( "현재의 포인터가 무효 포인터 (파라미터 2).");
BREAK는;
}
0 반환;
}
(m_data.wVersion = 514!)가 2.2 // 즉 단일 바이트 진수로 저장 2.2 열고 실패하면 514
부재의 상위 바이트를 획득 {//HIBYTE(m_data.wVersion)는 (즉, 더 높은 버전 번호) LOBYTE ()은 멤버의 하위 바이트 취득
하면 WSACleanup을 (); // 지정된 버전 실패 열 네트워크가 꺼져 라이브러리
시스템 ( "PAUSE");
반환 0;
}

/ * 2 * 생성 서버 소켓 /
소켓 m_ServerSocket = 소켓 (AF_INET, SOCK_STREAM, IPPROTO_TCP의 이동); // 윈도우 핸들이 MFC 비슷 포트 작업은을 사용할 필요가 소켓 값
// 주소 파라미터 타입 1 (IPV4 형태), 소켓 타입 2 (순차 안정적 양방향 접속 기반 바이트 스트림) 프로토콜의 3 개 종류 (TCP 프로토콜 파라미터 1에 대응)

경우 (m_ServerSocket == INVALID_SOCKET) // 생성 실패
{
INT m_ErrorNum = WSAGetLastError ();
의 printf ( "오류 코드로 실패 서버 소켓 생성합니다 : % d 개 \ N- 형", m_ErrorNum),
WSACleanup을 (); // 지정된 버전을 열 수 없습니다를 다음 네트워크 라이브러리 해제
; 시스템 ( "PAUSE")
반환 0;
}

/ * 3 * / 서버에 연결되어
// 서버의 부하 정보를 상기 m_ServerMsg를 sockaddr_in
m_ServerMsg.sin_family = AF_INET; // 주소 유형
m_ServerMsg.sin_addr.S_un.S_addr = inet_addr은 ( "127.0.0.1") ; // 서버 IP 주소자를 저장되어있는 IP 어드레스로 직렬 형태는 127.0.0.1 루프백 주소가 로컬 (NO PC)는 테스트 사용
m_ServerMsg.sin_port = htons (12345) 서버 // 포트 번호는 호스트 네트워크 바이트 순서 바이트로 변환되고 시퀀스
의 INT m_connect 연결 (m_ServerSocket (SOCKADDR *) m_ServerMsg, sizeof의 (m_ServerMsg을)) =;
IF를 (m_connect! = 0)
{
INT m_ErrorNum = WSAGetLastError ();
의 printf ( "서버로의 연결이 실패 오류 코드 % D \ n" , m_ErrorNum)
closesocket 함수 (m_ServerSocket); // 가까운 생성 된 소켓,
WSACleanup을 (); // 네트워크 라이브러리의 특정 버전을 열 수 없습니다가 닫혀
시스템 ( "PAUSE은");는
반환 0;
}
의 printf ( "서버가 성공적으로 연결했다 \ n ");


그동안 (1.)
{
서버에 / * 메시지를 보냈습니다 4 * /.
문자 CtoSbuf [1500] = {0}; 서버에 // 클라이언트
의 printf ( "클라이언트");
얻는다 (CtoSbuf)
INT m_ServerStrLen = 보내기 ( m_ServerSocket, CtoSbuf, 나 strlen (CtoSbuf) , 0); // 길이 목적 소켓, 데이터 전송, 데이터 전송은 전송 방식
(SOCKET_ERROR의 m_ServerStrLen가된다 ==) IF
{
m_ErrorNum하는 int WSAGetLastError = ();
인 printf ( "클라이언트가 데이터를 전송 오류 코드, 실패 : % D \ N- ", m_ErrorNum);
}

/ * 서버 (5) * /에 의해 송신되는 데이터 수신
// 서버로부터 전송 된 문자 저장, 문자 StoCbuf [1500] = {0}
m_ClientStrLen = RECV하는 int (m_ServerSocket, StoCbuf ,는 sizeof (StoCbuf), 0); // 1 sockt에 저장되어있는 것입니다 수락에서 클라이언트 동작 할 때까지 항상 차단 된 상태가됩니다 읽기 모드의 수 (0 기본값) 넣어
(m_ClientStrLen == 0) // 그 클라이언트가 오프라인 인 경우
{
( "연결 서버 폐쇄 중단된다")의 printf
}
다른 IF (SOCKET_ERROR의 m_ClientStrLen이다 ==)
{
WSAGetLastError = () m_ErrorNum INT]
의 printf ( "클라이언트 데이터 수신 실패 오류 코드 % D \ n"m_ErrorNum );
BREAK;
}
다른
{
의 printf ( "서버 % S \ N-"StoCbuf)
}
(StoCbuf == "886") IF
{
BREAK;
}
}


closesocket 함수 (m_ServerSocket); // 가까운 생성 된 소켓,
WSACleanup을 (); //이 다음 가까운 네트워크 라이브러리 지정된 버전을 열 수 없습니다
시스템 ( "PAUSE를");
}  

 

먼저 서버를 실행 한 다음 클라이언트, 다음과 같은 운영 결과를 실행

추천

출처www.cnblogs.com/aaaguai/p/12052135.html