1. TCP 서버의 흐름
2. 함수 설명
2.1 서버
2.1.1 WSAStartup() / WSACleanup()
* 윈속 라이브러리 초기화
2.1.2 socket()
* 소켓 생성
2.1.3 bind()
* 소켓에 주소 할당
2.1.4 listen()
* 연결요청 대기 상태
2.1.5 accept()
* 연결요청 수락
2.1.6 recv()
* 자료 받기
2.1.7 send()
* 자료 보내기
2.1.7 closesocket()
* 소켓 닫기
2.2 클라이언트
2.2.1 connect()
* 서버에 연결 요청
< TCP 서버/클라이언트 구조 >
< 반복 서버의 흐름 >
2. 함수 설명
2.1 서버
2.1.1 WSAStartup() / WSACleanup()
* 윈속 라이브러리 초기화
int WSAStartup( WORD wVersionRequested, LPWSASATA lpWSAData );
성공 시 0, 실패 시 0이 아닌 에러코드 값 반환
wVersionRequested: 프로그래머가 사용할 윈속의 버전정보 전달.
lpWSAData: WSADATA라는 구조체 변수의 주소 값 전달.
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: 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달
af: 소켓이 사용할 프로토콜 체계 정보 전달
type: 소켓의 데이터 전송 방식에 대한 정보 전달
protocol: 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달
2.1.3 bind()
* 소켓에 주소 할당
int bind( SOCKET s, const struct sockaddr* name, int namelen );
성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환
s: 주소정보를 할당할 소켓의 핸들
name: 할당하고자 하는 주소정보를 지니는 구조체 변수의 주소 값
namelen: 두번째 인자로 전달된 구조체 변수의 길이 정보
s: 주소정보를 할당할 소켓의 핸들
name: 할당하고자 하는 주소정보를 지니는 구조체 변수의 주소 값
namelen: 두번째 인자로 전달된 구조체 변수의 길이 정보
2.1.4 listen()
* 연결요청 대기 상태
int listen( SOCKET s, int backlog );
성공 시 0, 실패 시 SOCKET_ERROR 반환
s: 연결요청 대기상태에 두고자 하는 소켓의 핸들 전달, 이 함수의 인자로 전달된 핸들의 소켓이 서버 소켓(리스닝 소켓)이 된다.
backlog: 연결요청 큐의 크기정보 전달, 5가 전달되면 큐의 크기가 5가 되어 클라이언트의 연결요청을 5개까지 대기시킬 수 있다.
s: 연결요청 대기상태에 두고자 하는 소켓의 핸들 전달, 이 함수의 인자로 전달된 핸들의 소켓이 서버 소켓(리스닝 소켓)이 된다.
backlog: 연결요청 큐의 크기정보 전달, 5가 전달되면 큐의 크기가 5가 되어 클라이언트의 연결요청을 5개까지 대기시킬 수 있다.
2.1.5 accept()
* 연결요청 수락
SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen );
성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환
s: 서버 소켓의 핸들 전달
addr: 연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전달, 함수호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다.
addrlen: 두 번째 매개변수 addr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기 정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.
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: 데이터 수신 시 적용할 다양한 옵션 정보 전달
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: 데이터 전송 시 적용할 다양한 옵션 정보 전달
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에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.
s: 클라이언트 소켓의 핸들 전달
name: 연결요청 할 서버의 주소정보를 담은 변수의 주소 값 전달, 함수 호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다.
namelen: 두 번째 매개변수 servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.