본문 바로가기
programing/Networks

소켓 프로그래밍 기본 함수 및 소켓과 프로토콜

by RedWiz 2015. 5. 12.

 

Socket.zip

 

TCP_Echo.zip

 

- 소켓 : 네트워크 상에서 데이터 송수신을 할 수 있는 소프트웨어적인 장치

연결의 의미로 전기 소켓과 마찬가지로 소켓이란 이름을 사용한다

 

- 프로토콜 : 데이터를 서로 주고 받기 위한 약속

 

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

 

- winsock의 초기화

 

※ WSADATA : 윈도우 소켓 시스템 정보 구조체

struct WSAData{

WORD                wVersion;    // 소켓 버전

WORD                wHighVersion;    // DLL이 지원 할 수 있는 가장 높은 버전(보통 vVersion과 동일)

char                  szDescription[WSADESCRIPTION_LEN+1]; 

// 적재된 WS2_32.dll에서 소켓 관련 설명 문자열

char                  szSystemStatus[WSASYSSTATUS_LEN+1];

// 시스템의 각종 상태를 알 수 있음

unsigned short    iMaxSockets;    // 하나의 프로세스가 열 수 있는 소켓 최대수(ver2부터 무시)

unsigned short    iMaxUdpDg;    // 어플리케이션이 전송하는 데이터그램 최대 크기(ver2부터 무시)

char FAR*          lpVendorInfo;    // 벤더에 특유의 데이터 구조체의 for pointer(ver2부터 무시)

};

 

※ 소켓 라이브러리 초기화 : 소켓 버전을 알리고, 라이브러리 초기화 작업, 소켓 시스템 정보 받음

int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

// 성공 : 0, 실패 : 에러코드

// MAKEWORD(1, 2) : 주 버전 1, 부버전 2, 0x0201 반환 (하위 WORD 부터)
// MAKEWORD(2, 2) : 주 버전 2, 부버전 2, 0x0202 반환

 

* 오류 발생시 WSAGetLastError() 사용하면 코드로 오류를 알 수 있다.

 

※ 소켓 라이브러리 해제

int WSACleanup(void);

// 성공 : 0, 실패 : SOCKET_ERROR

 

- 윈도우 기반 소켓관련 함수

 

※ 소켓 생성

SOCKET socket(

int af,               // 프로토콜 체계 (Protocol Family)

int type,            // 소켓 타입 (전송 방식)

int protocol       // 프로토콜

);

// 성공 : 소켓핸들, 실패 : INVALID_SOCKET (값이 -1 이지만 이 상수 사용)

 

* 프로토콜 체계

PF_INET            IPv4 인터넷 프로토콜 체계

PF_INET6           IPv6 인터넷 프로토콜 체계

PF_LOCAL        로컬 통신을 위한 UNIX 프로토콜 체계

PF_PACKET      Low Level 소켓을 위한 프로토콜 체계

PF_IPX             IPX 노벨 프로토콜 체계

 

* 소켓 타입

>SOCK_STREAM : 연결지향형 소켓 -> TCP

- 중간에 소멸x. 순서대로, 데이터의 경계 존재 안함, 소켓간의 연결은 반드시 1대 1

- 신뢰성 있는 순차적인 바이트 기반의 연결지향 데이터 전송 방식

>SOCK_DGRAM  : 비 연견지향형 소켓 -> UDP

- 손실 우려, 순서 상관없이 빠른 전송 지향, 데이터 경계 존재, 한번에 전송할 수 있는 크기 제한

- 신뢰성과 순차적 데이터 전송을 보장하지 않는, 고속 데이터 전송을 목적

 

cf. 연결 지향형 소켓은 상대 소켓의 상태를 파악하며 전송하기때문에

버퍼 공간이 모자라도 손실이 안일어 남

 

* 프로토콜

★ 하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재할 수 있다

>TCP 소켓 : IPv4 인터넷 프로토콜 체계에서 동작하는 연결 지향형 데이터 전송 소켓 (하나만 존재)

ex) int tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

>UDP 소켓 : IPv4 인터넷 프로토콜 체계에서 동작하는 비 연결지향형 데이터 전송 소켓 (하나만 존재)

ex) int udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

 

※ IP와 주소 할당

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

// 성공 : 0, 실패 : SOCKET_ERROR

 

※ 클라의 연결 요청을 받아들일 수 있는 상태 만듦

int listen(SOCKET s, int backlong);

// 성공 : 0, 실패 : SOCKET_ERROR

 

※ 연결 요청 수락

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

// 성공: : 소켓핸들, 실패 : INVALID_SOCKET

 

※ 연결 요청

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

// 성공 : 0, 실패 : SOCKET_ERROR

 

※ 소켓 닫음

int closesocket(SOCKET_ERROR);

// 성공 : 0, 실패 : SOCKET_ERROR

 

- 윈도우 기반 입출력 함수

 

※ 전송

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

// 성공 : 전송 바이트 수, 실패 : SOCKET_ERROR

s : 연결 대상 소켓, buf: 전송 데이터 버퍼 주소값, len : 데이터 바이트 수

 

※ 수신

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

// 성공 : 수신 바이트 수(EOF 전송 시 0), 실패 : SOCKET_ERROR 

s : 연결 대상 소켓, buf: 수신 데이터 저장할 버퍼 주소값, len : 버퍼 바이트 수

 

cf.

inet_addr()

-> 숫자와 점으로 이루어진 문자열을 long형 IP 주소로 변환

 

htons() : host to network short

-> 호스트로부터 빅엔디안인 TCP/IP 네트워크 바이트 순서로 u_short로 변환

 

 

 

 

 

'programing > Networks' 카테고리의 다른 글

Half-close, DNS, 소켓 옵션  (0) 2015.05.15
UDP 기반 서버 / 클라  (0) 2015.05.14
TCP 기반 서버 / 클라  (0) 2015.05.13
주소 체계와 데이터 정렬  (0) 2015.05.12
[펌] BeeJ's Guide to Network Programming  (0) 2015.05.04