Socket 함수 정리
Network/Network 2011. 12. 22. 10:261. 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 |