TCP 프로그램 개발 단계

TCP는 양측이 먼저 통신 연결을 구축하는 데 필요한, 연결 지향 프로토콜입니다. 대부분의 응용 프로그램에 사용되는 TCP,하지만, 상대적으로 높은 시스템 리소스 요구 사항의 신뢰성과 안정적인 특성 때문에.

개발 과정에 나타낸 바와 같이 TCP 프로토콜 서버 절차는 다음이다.

// 프로토콜 버전에 대한 초기화 윈속 라이브러리
 // 서비스 소켓 객체를 생성 (지정된 프로토콜 유형, 주소, 가족 정보)
 // 바인딩 소켓 (포트 소켓에 바인딩, IP를 지정)
 // 청취를 시작하고, 청취자의 수를 설정 . (모니터링 시작 후, 클라이언트가 성공적으로 연결할 수 있습니다)
 // 연결을받을 포트를 열고
 // 전송하고 (통신 연결을 설정하기 위해 소켓 객체를 사용하여) 데이터를 수신
 // 밀접한 관계 소켓
 // 통화 종료 윈속 라이브러리

TCP 서버 프로그램의 완료 개발 초기화 윈속 라이브러리소켓 (소켓) 대상을 생성 일반적으로 두 단계 후에, 우리는 다음 단계를 완료해야합니다.

(1) 바인드 지정된 IP 주소와 포트로 소켓

소켓 서버의 IP와 포트를 바인드해야합니다 사용하여 서버 측 프로그램 프로토콜에 상관없이 이전에 생성, 클라이언트 프로그램은 그것과 통신합니다. 함수는 소켓이 바인드, 다음과 같은 프로토 타입을 결합합니다.

int로 바인드를 ( 
 SOCKET S가 // 소켓 핸들 
 CONST  구조체 FAR을 SOCKADDR * 이름     // 바인딩 어드레스 
 INT namestr에                          // 이름으로 지정 어드레스 길이 
);

첫 번째 매개 변수의 소켓 함수에 의해 반환 된 주소를 바인딩하는 소켓 핸들입니다.

두 번째 매개 변수는 SOCKADDR 구조의 이름에 대한 포인터이며, 소켓의 주소를 바인딩 지정하는 데 사용됩니다.

TCP, UDP 프로토콜의 경우, 주소는 일반적으로 TCP의 IP 주소와 포트 번호, 구조 대신 SOCKADDR를 sockaddr_in UDP 프로토콜입니다. 어느 이하로 정의된다.

구조체 {를 sockaddr_in
     짧은   상기 sin_family       // AF_INET로 주소 패밀리 (주소 형식), 윈도우 
    sin_port u_short;        // 포트 번호 
    구조체 sin_addr in_addr를; // 의 IP 주소 
       [대 sin_zero . 8 ];      // 자리 값, 보통 0 
};

함수 파라미터 AF 동일한 소켓 sin_family의 제 부재.

두 번째 멤버 sin_port는 TCP 나 UDP 통신 서비스의 포트 번호를 지정합니다. 응용 프로그램은 IANA (인터넷 할당 번호 Authorith) 관리에 의해, 1023, 0을 포트 번호를 선택할 때주의를 기울여야한다, 공공 서비스 예약, 일반 사용자 응용 프로그램은 1024 개 이상의 포트 번호를 선택해야합니다. 또한 참고 여기서 사용 된 값은 네트워크 바이트 순서이며, 숫자는 컴퓨터 호스트 바이트 순서로 저장된다. 아래와 같이 윈속 라이브러리는, 두 서열 간의 변환하기위한 변환 함수의 세트를 제공한다.

htons는 (hostshort u_short) u_short; // 네트워크 바이트 순서로 호스트 별 바이트 순서 변환 u_short 유형 
u_long 형태 htonl (u_long 형태 hostlong)     // 네트워크 바이트 순서로 호스트에 의해 유형 u_long 형태 바이트 순서 변환 
ntohs u_short (u_short netshort)   // 타입 u_short 호스트 바이트 순서로 네트워크 바이트 순서 변환 
(netlong를 u_long 형태) u_long 형태 ntohl;      // u_long 형태 호스트 바이트 순서로 네트워크 바이트 순서 변환 형식

예를 들어, 우리가 포트 6000을 사용하려면, 그것은 sin_port = htons (6000)이어야한다;

다음에 정의되는 전체 32 비트 값을 공동 처리로서 정의 된 IP 어드레스를 저장하기 위해 이용되는 상기 제 3 부재 sin_addr.

구조체 in_addr를 { 
    노동 조합 { 
        구조체 {의 u_char s_b1, s_b2, s_b3, s_b4; S_un_b};
        구조체 {u_short의 s_w1, s_w2; S_un_w}; 
        u_long 형태의 s_addr; 
    } 태양;

우리는 IP 주소는 네 부분으로 구성되어 알고, 각 부분은 점으로 보통 "xxx.xxx.xxx.xxx"형식을 분리. IP 주소는 실제로 즉, 4 바이트로 이루어진 각각의 부분의 각 바이트는 도트로 구분해야 32 비트 데이터이다. 따라서, 각 구역의 최대 값은 255이다. 이 문자열 할당의 구성원의 직접 사용은, 일반적으로 번역해야하는 경우, 윈속 라이브러리는 다음과 같은 변환 기능을 제공합니다.

부호 길이 inet_addr은 ( CONST  CHAR   FAR * CP);
 FAR * inet_ntoa ( 구조체   in_addr를  );

작업 기능은 네트워크 바이트 순서 캐릭터 등록 변화로 나타내는 32 비트 IP 주소 값 inet_addr은 방법.

Inet_ntoa 동작 기능은 네트워크 바이트 순서 32 비트 값의 IP 주소로 표현되는 IP 주소의 문자열 표현으로 변환하는 것이다.

동일한 크기의 세트, 다른 의미로 네번째 멤버 sin_zero의 SOCKADDR 구조체.

기능 그렇지 않으면 에러 코드를 얻을 수 SOCKET_ERROR를 사용 WSAGetLastError 함수를 반환은 0 반환 성공합니다.

(2) 연결을 수신

바인딩 지정을위한 소켓은 IP 주소와 포트 번호입니다 청취 상태로 소켓 후 설정해야하는 경우, 클라이언트 연결을 수신. 사용 함수 프로토 타입은 그대로 다음 들어요.

int로 청취 ( 
 SOCKET S,    // 소켓 핸들 
 INT의 잔고   //가 큐에 남아있는 허용 최대 연결 수는 처리되지 않은 수신 대기 
);

청취 상태로 서버 세트 소켓 및 대기열이 아직 가득 차지 않은 경우, 클라이언트 연결 기능은 연결에 성공하거나 시간이 초과 될 때까지 다른 클라이언트 연결 처리 기능이 차단 성공적으로 연결할 수 있습니다.

(3) 상기 접속 요청을 수락

청취 상태로 서버 소켓은, 그것은 연결, 연결을 완료 입력하거나 기능이 연결의 도착 때까지 차단, 또는 소켓 객체가 받아 즉시 반환을 기다리고있을 경우이 기능은 라인 연결에 대기 수락 동의를 사용해야하는 경우 닫기. 함수 프로토 타입을 수용하는 등 다음이다.

소켓 (수락 
SOCKET S가 // 소켓 핸들 
구조체 * ADDR 멀리 SOCKADDR를 // 구조를 sockaddr_in 포인터 어드레스 수신 다른 
INT FAR * addrlen      // 메모리 크기 ADDR 포인터 
);

이 기능은 제 처리되지 않은의 연결에 연결 소켓에 촬영되어, 새로운 소켓을 생성하고이 새로운 포스트를 사용하여 커넥터, 데이터 전송 및 수신에 핸들을 반환하면 소켓을 완료하는 것입니다.

도 TCP 클라이언트 프로그램 개발 프로세스는 다음이다.

// 프로토콜 버전에 대한 초기화 윈속 라이브러리
 // 서비스 소켓 객체를 생성 (지정된 프로토콜 유형, 주소, 가족 정보)
 // 연결 (서버에 연결하려면 IP와 포트 지정)
 // 전송을하고있을 것입니다 확립 된 연결을 사용하여 (Socket 객체를 데이터를 수신 통신)
 // 가까운 연결 소켓
 // 윈속에 대한 호출을 종료

는 TCP 클라이언트 프로그램의 개발에 관해서는, 완료 초기화 윈속 라이브러리소켓 (소켓) 대상 생성 일반적으로 두 단계 이후를, 다음 단계는 다음과 같이 서버에 연결, 함수 프로토 타입 인 연결 기능 동수를 사용하는 것입니다.

INT 연결 (S SOCKET은             // 소켓 핸들 
CONST  구조체 * 이름 멀리 SOCKADDR를 // 서버의 구조를 sockaddr_in 포인터, 지정된 주소가 연결 
INT namestr에   // ADDR 포인터 메모리 크기 
);

함수가 0을 반환 성공, 다음의 전송 및 소켓을 사용하여 데이터를받을 수 있습니다. 함수는 SOCKET_ERROR가 사용 기능 추가 WSAGetLastError 오류 코드를 얻을 반환하지.

여부 TCP 프로토콜 서버 프로그램 또는 클라이언트 프로그램은 데이터가이다는 등 다음 송신 함수 프로토 타입을 사용하여 전송됩니다.

int send(
 SOCKET s,               //已建立连接的套接字句柄
 const char FAR *buf,    //要发送的内容所在内存首地址
 int len,                //发送内容的长度
 int flags               //指定调用方式,通常置为0
);

函数执行成功后返回实际发送数据的字节数。

接收数据使用recv函数,原型如下。

int recv(
 SOCKET s,          //已建立连接的套接字句柄
 char FAR *buf,     //要接收的内容所在内存首地址
 int len,           //接收数据缓冲区的长度
 int flags          //指定调用方式,通常置为0
);

函数执行成功后返回实际接收数据的字节数。在阻塞模式下,recv将阻塞线程的执行,直至接收到数据。

추천

출처www.cnblogs.com/cyx-b/p/12535263.html