[손동진] TCP 서버/클라이언트 구조

Programming/Network 2010. 6. 14. 15:04 Posted by 알 수 없는 사용자
1. TCP 서버의 흐름

< TCP 서버/클라이언트 구조 >


< 반복 서버의 흐름 >



2. 함수 설명

2.1 서버

2.1.1 WSAStartup() / WSACleanup()

* 윈속 라이브러리 초기화

int WSAStartup( WORD wVersionRequested, LPWSASATA lpWSAData );

성공 시 0, 실패 시 0이 아닌 에러코드 값 반환

wVersionRequested: 프로그래머가 사용할 윈속의 버전정보 전달.

lpWSAData:  WSADATA라는 구조체 변수의 주소 값 전달.


* 윈속 라이브러리 해제

int WSACleanup(void);

성공 시 0, 실패 시 SOCKET_ERROR 반환



2.1.2 socket()

* 소켓 생성

SOCKET socket( int af, int type, int protocol );

성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환

af: 소켓이 사용할 프로토콜 체계 정보 전달

type: 소켓의 데이터 전송 방식에 대한 정보 전달

protocol: 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달



2.1.3 bind()

* 소켓에 주소 할당

int bind( SOCKET s, const struct sockaddr* name, int namelen );

성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환

s: 주소정보를 할당할 소켓의 핸들

name: 할당하고자 하는 주소정보를 지니는 구조체 변수의 주소 값

namelen: 두번째 인자로 전달된 구조체 변수의 길이 정보



2.1.4 listen()

* 연결요청 대기 상태

int listen( SOCKET s, int backlog );

성공 시 0, 실패 시 SOCKET_ERROR 반환

s: 연결요청 대기상태에 두고자 하는 소켓의 핸들 전달, 이 함수의 인자로 전달된 핸들의 소켓이 서버 소켓(리스닝 소켓)이 된다.

backlog: 연결요청 큐의 크기정보 전달, 5가 전달되면 큐의 크기가 5가 되어 클라이언트의 연결요청을 5개까지 대기시킬 수 있다.



2.1.5 accept()

* 연결요청 수락

SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen );

성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환

s: 서버 소켓의 핸들 전달

addr: 연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전달, 함수호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다.

addrlen: 두 번째 매개변수 addr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기 정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.



2.1.6 recv()

* 자료 받기

int recv( SOCKET s, const char* buf, int len, int flags );

성공 시 수신한 바이트 수(단 EOF 전송 시 0), 실패 시 SOCKET_ERROR 반환

s: 데이터 수신 대상과의 연결을 의미하는 소켓의 핸들 값 전달

buf: 수신된 데이터를 저장할 버퍼의 주소 값 전달

len: 수신할 수 있는 최대 바이트 수 전달

flags: 데이터 수신 시 적용할 다양한 옵션 정보 전달



2.1.7 send()

* 자료 보내기

int send( SOCKET s, const char* buf, int len, int flags );

성공 시 전송된 바이트 수, 실패 시 SOCKET_ERROR 반환

s: 데이터 전송 대상과의 연결을 의미하는 소켓의 핸들 값 전달

buf: 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달

len: 전송할 바이트 수 전달

flags: 데이터 전송 시 적용할 다양한 옵션 정보 전달



2.1.7 closesocket()

* 소켓 닫기

int closesocket( SOCKET s );

성공 시 0, 실패 시 SOCKET_ERROR 반환



2.2 클라이언트

2.2.1 connect()

* 서버에 연결 요청

int connect( SOCKETs, const struct sockaddr* name, int namelen );

성공 시 0, 실패 시 SOCKET_ERROR 반환

s: 클라이언트 소켓의 핸들 전달

name: 연결요청 할 서버의 주소정보를 담은 변수의 주소 값 전달, 함수 호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다.

namelen: 두 번째 매개변수 servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.