먼저 서버에서의 소켓의 생성과정을 간단히 정리하면,
1. 소켓생성 (socket 함수호출)
2. IP주소와 PORT번호 할당 (bind 함수호출)
3. 연결요청 가능상태로 변경 (listen 함수호출)
4. 연결요청에 대한 수락(accept 함수호출)
이렇게 4단계 흐름으로 진행된다.
클라이언트에서는
1. 소켓생성
2. 연결요청(connet 함수호출)
단 2단계의 흐름으로 진행된다.
각각 과정에 따른 함수호출은 운영체제에 따라 다르기 때문에 나누어 보면,
리눅스
#include <sys/socket.h> //소켓을 사용하기 위한 리눅스 헤더파일
int socket (int domain, int type, int protocol); //소켓을 생성하는 함수
//성공시 파일 디스크럽터, 실패시 -1을 반환.
int bind (int sockfd, struct sockaddr *myaddr, socklen_t addrlen); //소켓에 주소정보를 할당하는 함수
//성공시 0, 실패시 -1 반환
int listen (int sockfd, int backlog); //소켓을 연결요청이 가능한 상태로 만드는 함수
//성공시 0, 실패시 -1 반환
int accept(int sockfd, struct sockaddr *addr, socklen_t); //연결요청을 수락하는 함수
//성공시 파일 디스크럽터, 실패시 -1 반환
int connect (int sockfd, struct sockaddr *addr, socklen_t addrlen); //서버로의 연결요청
//성공시 0, 실패 시 -1 반환
int socket (int domain, int type, int protocol); //소켓을 생성하는 함수
//성공시 파일 디스크럽터, 실패시 -1을 반환.
int bind (int sockfd, struct sockaddr *myaddr, socklen_t addrlen); //소켓에 주소정보를 할당하는 함수
//성공시 0, 실패시 -1 반환
int listen (int sockfd, int backlog); //소켓을 연결요청이 가능한 상태로 만드는 함수
//성공시 0, 실패시 -1 반환
int accept(int sockfd, struct sockaddr *addr, socklen_t); //연결요청을 수락하는 함수
//성공시 파일 디스크럽터, 실패시 -1 반환
int connect (int sockfd, struct sockaddr *addr, socklen_t addrlen); //서버로의 연결요청
//성공시 0, 실패 시 -1 반환
윈도우
윈도우는 기본적으로, 헤더파일 winsock2.h를 포함시키고, ws2_32.lib 라이브러리를 링크시키고 진행해야한다.
윈도우에서의 소켓프로그래밍(이하 윈속프로그래밍)은 반드시 WSAStartup함수를 호출해서,
프로그램에서 요구하는 소켓의 버전을 알리고, 해당버전을 지원하는 라이브러리의 초기화 작업을 진행해야한다.
#include <winsock2.h> //윈속을 사용하기 위한 헤더파일
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
//성공시 0, 실패시 0이아닌 에러코드반환
//앞의 인자는 소켓의 버전정보로써 MAKEWORD(2,2) 이런식으로 매크로함수를 통하여 사용한다.(2.2소켓버전이라는뜻)
//뒤의 인자는 WSADATA구조체 변수의 주소값으로서 함수호출이 완료되면 초기화된 라이브러리의 정보가 채워진다.
SOCKET socket(int af, int type, int protocol);
//성공시 소켓 핸들, 실패시 INVALID_SOCKET 반환
int bind ( SOCKET s, const struct sockaddr * name, int namelen);
//성공시 소켓 핸들, 실패시 INVALID_SOCKET 반환
int listen( SOCKET s, int backlog);
//성공시 0, 실패시 sock_error반환
SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);
//성공시 소켓 핸들, 실패시 INVALID_SOCKET 반환
int connect (SOCKET s, const struct sockaddr * name, int namelen);
int closesocket(SOCKET s);
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
//성공시 0, 실패시 0이아닌 에러코드반환
//앞의 인자는 소켓의 버전정보로써 MAKEWORD(2,2) 이런식으로 매크로함수를 통하여 사용한다.(2.2소켓버전이라는뜻)
//뒤의 인자는 WSADATA구조체 변수의 주소값으로서 함수호출이 완료되면 초기화된 라이브러리의 정보가 채워진다.
SOCKET socket(int af, int type, int protocol);
//성공시 소켓 핸들, 실패시 INVALID_SOCKET 반환
int bind ( SOCKET s, const struct sockaddr * name, int namelen);
//성공시 소켓 핸들, 실패시 INVALID_SOCKET 반환
int listen( SOCKET s, int backlog);
//성공시 0, 실패시 sock_error반환
SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);
//성공시 소켓 핸들, 실패시 INVALID_SOCKET 반환
int connect (SOCKET s, const struct sockaddr * name, int namelen);
int closesocket(SOCKET s);
'Programing > Network Programing' 카테고리의 다른 글
[Winpcap] 간단한 스니퍼 프로그램 예제. (1) | 2012.03.27 |
---|---|
[Winpcap] winpcap 시작 레퍼런스 (0) | 2012.03.27 |
[C/C++] Windows ICMP Flood Programing (2) | 2011.05.28 |
[C]서버 클라이언트 모델 네트워크 프로그래밍 (1) | 2010.12.21 |