티스토리 뷰

프로그래밍/API

API 소켓프로그래밍1

에어버스 2016. 5. 6. 16:38

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 소켓기술자);

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30