- 소켓 : 네트워크 상에서 데이터 송수신을 할 수 있는 소프트웨어적인 장치
연결의 의미로 전기 소켓과 마찬가지로 소켓이란 이름을 사용한다
- 프로토콜 : 데이터를 서로 주고 받기 위한 약속
#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 |