NETWORK PROGRAMMING for microsoft WINDOWS(Anthony Jones & Jim Ohlund)
윈속의 헤더와 라이브러리
일반적으로 새로 응용프로그램을 개발하고자 한다면 WINSOCK2.H를 include 하여 윈속2로 개발한다.
이 때 WS2_32.LIB 파일을 링크시켜야 한다.
만일 MSWSOCK.H의 확장 API를 사용한다면 MSWSOCK.LIB를 추가로 링크시켜야 한다.
윈속 초기화
윈속 라이브러리의 로드 :
int WSAStartup (
WORD wVersionRequested, // 로드 하기를 윈하는 윈속 라이브러리의 버전
LPWSADATA lpWSAData // 로드된 라이브러리에 대한 정보가 리턴
);
에러 검출과 처리 (Error Checking and Handling)
대부분의 윈속 함수는 에러 발생시 SOCKET_ERROR를 리턴한다.
SOCKET_ERROR의 실제 값 = -1
윈속 함수를 호출하고 에러를 리턴 받았다면 WSAGetLastError 함수를 호출 -> 어떤 원인에 의하여 에러가 발생되었는지 확인!
int WSAGetLastError(void); // 해당 에러에 대한 코드값 리턴
프로토콜의 주소 지정(Addressing a Protocol)
인터넷 프로토콜(IP, Internet Protocol).
IP는 대부분의 OS에서 사용이 가능하고 대부분의 LAN(Local Area Network)과 WAN(Wide Area Network)에서 사용하고 있다.
TCP와 UDP는 IP 기반의 프로토콜로서 TCP/IP와 UDP/IP라고 부르기도 한다.
이 장에서는 IPv4만을 다룬다.
소켓 생성
윈도우 플랫폼에서는소켓이 파일 디스크립터와 다르며 WINSOCK2.H의 SOCKET은 파일 디스크립터와 전혀 다른 형식으로 정의되어 있다.
SOCKET socket (
int af, // 프로토콜의 어드레스 패밀리 (AF_INET)
int type, // 프로토콜의 소켓 타입
int protocol // 프로토콜을 지정하는 필드
);
연결 지향 통신(Connection-Oriented Communication)
TCP/IP를 통하여 이루어 진다. TCP는 신뢰성 있는 데이터 전송을 제공한다.
서버측 API 함수들
Winsock Server : socket() / WSASocket() -> bind() -> listen() -> accept() / WSAAccept()
Winsock Client : socket() / WSASocket() -> Address resolution -> connet() / WSAConnect()
*바인딩(Binding)
int bind (
SOCKET s, // 클라이언트의 연결을 기다릴 소켓
const struct sockaddr FAR* name, // 프로토콜에 해당하는 구조체 값을 채운 후 sockaddr의 포인터로 형변환 입력
int namelen // 두번째 파라메터로 입력된 프로토콜의 구조체의 크기
);
- 호출할 때 에러가 발생되면 SOCK_ERROR를 리턴한다. bind 호출 시 발생되는 일반적인 에러는 WSAEADDERINNUSE이다.
*연결 대기(listening)
int listen (
SOCKET s, // 바인드 된 소켓
int backlog // 들어오는 연결을 대기시킬 수 있는 최대 개수
);
*연결 수락(Accept Connections)
SOCKET accept (
SOCKET s, // 연결 대기 모드에 잇는 소캣
struct sockaddr FAR* addr, // 구조체 SOCKADR_IN의 주소
int FAR* addrlen // 구조체 SOCKADR_IN의 길이의 주소값
);
*연결 (Connect)
int connect (
SOCKET s, // 연결하기를 원하는 소켓
const struct sockaddr FAR* name, // 연결할 서버의 주소를 담을 구조체
int namelen // name 변수의 크기
);
*데이터 전송
int send (
SOCKET s, // 데이터를 전송하길 우너하는 연결된 소켓
const char FAR* buf, // 전송할 데이터가 담긴 char 형 버퍼
int len, // 전송할 데이터의 크기
int flags
);
int recv (
SOCKET s, // 데이터를 수신할 소켓
char FAR* buf, // 수신된 데이터를 담을 char형 버퍼
int len, // 수신하길 우너하는 크기, 혹은 버퍼의 크기
int flags
);
*연결 종료
int shutdown (
SOCKET s,
int how // SD_RECEIVE, SD_SEND, SD_BOTH 중에 하나의 값을 가진다.
);
댓글 없음:
댓글 쓰기