티스토리 뷰
API 소켓프로그래밍
- 바이트오더링 (Bytes Ordering)
0x2A103B15
리틀 엔디안(Little Endian) 방식 저장은 15, 3B, 10, 2A 순으로 저장되고,
빅 엔디안 방식은 순서대로 2A, 10, 3B, 15 순으로 저장한다.
Intel CPU는 리틀 엔디안 방식이다.
윈도우즈OS에서는 인텔 CPU 사용하므로 리틀 엔디안 방식인데, 호스트 바이트 오더 라고 부른다.
하지만, 네트워크 규정은 빅 엔디안 방식이 표준이기 때문에 윈속(WinSock)내부에서는 빅 엔디안으로 변환하는 작업이 필요하다.
1. 소켓 라이브러리 초기화
int WSAStartup(
WORD 윈속 라이브러리 최상위 버전
LPWSADATA 윈속시스템정보를 반환할 WSADATA 구조체 포인터);
2. 소켓 생성
SOCKET socket(
int 주소영역정의, // IPv4: AF_INET, IPv6 : AF_INET6
int 소켓타입,
int 프로토콜);
<소켓타입>
SOCK_STREAM TCP/IP기반통신
SOCK_DGRAM UDP
SOCK_RAW IP헤더를 직접 제어하기위한 목적으로 사용
<프로토콜>
BTHPROTO_RFCOMM 블루투스 통신
PROTO_TCP TCP
PROTO_UDP UDP
<리턴 에러코드>
WSANOTINITIALISED WSAStartup 의 성공적인 호출없이 사용함
WSAENETDOWN 네트워크 서브시스템 혹은 서비스 프로바이더에 에러발생
WSAEAFNOSUPPORT 지정된 주소 체제가 지원하지 않음
WSAEMFILE 할당할 수 있는 소켓 기술자가 없어서 더 이상 소켓을 생성할 수 없음
WSAENOBUFS 사용할 수 있는 버퍼가 없어서 소켓을 생성할 수 없음
WSAEPROTOTYPE 잘못된 프로토콜을 사용했음
WSASOCKTNOSUPPORT 잘못된 주소체제를 사용했음
3. 바인드
int bind(
SOCKET 소켓객체,
const struct sockaddr* 주소정보를 가진 구조체,
int 주소저옵를가진구조체 길이);
4. 접속대기
int listen(
__in SOCKET socket()로 생성된 SOCKET객체,
__in int 연결대기열크기); // 보통 5, 윈속2부터 SOMAXCONN 지정하면 자동 설정
5. 접속허용
SOCKET accept(
__in SOCKET 소켓기술자,
__out struct sockaddr 클라이언트주소정보를 복사해서 넘김, // 옵션으로 생략가능
__input int* 클라이언트주소정보 크기); // 생략가능
6. 서버 접속하기 (클라이언트인 경우)
int xonnect(
__in SOCKET 연결되지 않은 연결 기술자,
__in const struct sockaddr* 연결정보를 담고있는 sockaddr 구조체,
__in int 구조체 길이);
7. 송신
ssize_t send(
int 열린소켓번호,
const void* 데이터저장버퍼,
size_t 버퍼로 읽어올 크기,
int 옵션츨래그);
8. 수신
ssize_t recv(
int 소켓지정번호,
void* 버퍼,
size_t 읽어올 크기,
int 옵션플래그);
9. 접속종료
int closesocket(SOCKET 소켓기술자);