Socket 함수 정리

Network/Network 2011. 12. 22. 10:26

1. socket : 소켓을 생성

#include <sys/socket.h>

int socket(int domain, int type, int protocol);


반환 값 :

정상(fd >0), 실패(-1)

ERR_NO 

  EAFNOSUPPORT : Address Family를 지원하지 않음.

  EMFILE : 프로세스에서 더 이상 fd 생성 불가

  ENFILE : 시스템에서 더 이상 fd 생성 불가

매개변수 :

domain : Address Family ( AF_INET, AF_INET6 ...)

type : SOCK_STREAM(TCP), SOCK_DGRAM(UDP)

protocol : IPPROTO_TCP, IPPROTO_UDP


2. bind : 소켓을 주소에 묶는다.


#include <sys/socket.h>

int bind(int socket, const struct sockaddr *address, socklen_t address_len);


반환 

정상(0), 실패(-1)

ERR_NO

  EADDRINUSE : 지정한 주소가 사용 중

  EADDRNOTAVAIL : 이 시스템에서 사용할 수 없는 주소

  EBADF : socket 매개변수가 잘못된 fd

  EINVAL : socket은 이미 다른 주소로 bind되었다, 소켓 종료, 

                새로운 주소로 bind를 지원하지 않음.

매개변수

socket : socket file descriptor( socket()로 생성된)

address : 주소

address_len : address의 크기


3. 주소 구조체.


struct sockaddr {
    u_short sa_family;
    char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

struct in_addr {
    __u32   s_addr;
};



 sockaddr

sockaddr_in 

  u_short safamily

  short sin_family 

  char sa_data[14]

  u_short sin_port 

  struct in_addr sin_addr

  char sin_zero[8]


sockaddr은 주소 체계의 인터페이스와 같은 역할을 한다고 함.

우리가 사용하는 주소체계인 sockddr_in의 경우 sin_zero[8]이라는 패딩을 시키는 장면을 볼 수 있다.

in_addr의 경우는 32비트 데이터 형이다.


ex)


sockaddr_in addr;
addr.sin_family = PF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(1234);

bind(..., (struct sockaddr *)&addr, sizeof(addr));



4. listen 함수 : 네트워크 시스템의 들어오는 연결 요청을 임시로 저장하는 큐(accept 전까지)


#include <sys/socket.h>

int listen(int socket, int backlog);


반환 

성공(0), 실패(-1)

ERR_NO

  EBADF : socket 변수가 잘못된 디스크립터

  EDESTADDRREQ : bind가 되지 않았음.

  EINVAL : socket이 이미 연결됨.

매개변수

socket : listen을 할 소켓

backlog : Q의 크기


5. accept 함수 : 큐에 있는 연결 요청을 수락하여 처리한다.


#include <sys/socket.h>

int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);


반환

성공(fd >= 0) 실패(-1)

ERR_NO

  EAGAIN or EWOULDBLOCK : O_NONBLOCK옵션이 소켓 fd에 대해 설정되어 있으면, 

                                            현재 수락할 연결 요청이 없음.

  EBADF : socket이 잘못된 fd임.

  ECONNABORTED : 연결이 취소됨.

  EOPNOTSUPP : socket fd가 연결 수락을 지원하지 않음.


매개변수

socket : accept할 소켓 fd

address : 연결 성공이되면 상대방의 주소를 담아옴.

address_len : address의 크기를 담아옴.


6. connect 함수


#include <sys/socket.h>

int connect(int socket, const struct sockaddr *address, socklen_t address_len);


반환

성공(0), 실패(-1)

ERR_NO

  EALREADY : 연결 요청이 이미 소켓에서 수행 중이다.

  EBADF : socket 잘못된 fd

  ECONNREFUSED : 타겟이 연결을 대기하지 않거나 연결을 거절하였다.

  EISCONN : 지정한 소켓이 연결 모드에 있고 이미 연결 되었다.


매개변수

socket : 접속에 사용할 socket fd

address : 접속할 서버의 address

address_len : address의 크기


7. IP주소 관련.


#include <arpa/inet.h>

in_addr_t inet_addr(const char *cp);
char *inet_ntoa(const struct in_addr in);

unsigned long htonl (unsigned long hostlong);
unsigned short htons (unsigned short hostshort);
unsigned long ntohl (unsigned long netlong);
unsigned short ntohs (unsigned short netshort);


inet_addr : "127.0.0.1" ->32비트 정수형으로 변환

inet_ntoa : 32비트 정수형을 dotted decimal("127.0.0.1") 형태로 

htonl : Host(littel endian) TO Network(big endian)  Long

htons : Host(littel endian) TO Network(big endian)  Short

ntohl : Network TO Host Long

ntohs : Network TO Host Short

[출처] Socket 함수 정리|작성자 현님처럼

'Network > Network' 카테고리의 다른 글

IP주소, 서브넷마스크, 네트워크주소, 그리고 브로드캐스트주소  (1) 2011.12.26
소켓 옵션  (0) 2011.12.26
block & non-block  (0) 2011.12.22
socket select/poll  (0) 2011.12.22
IP Subnet  (0) 2011.12.02
: