struct sockaddr, sockaddr_in, sockaddr_un
Network/Network 2011. 11. 7. 16:35사용
bind(), connect()를 사용하는 socket 네트워크 프로그래밍에서 주소와 포트정보를 저장하기 위해서 사용한다.
<</usr/include/bits/socket.h>> struct sockaddr { unsigned short sa_family; // Address family and length char sa_data[14]; // Address data }
위의 네트워크 관련 함수들은 기본 데이터형으로 sockaddr 을 받아들인다. 그런데 sockaddr 로는 다양한 유형의 socket을 받아들일 수 없다. 예를 들어 AF_INET 소켓도 있고 AF_UNIX 소켓이 있는데 이들은 구조자체가 완전히 다르기 때문이다.
AF_INET의 경우에는 struct sockaddr_in 을 사용하고 AF_UNIX 의 경우에는 struct sockaddr_un 을 사용한다. 그러므로 실제 소켓 프로그래밍에서는 sockaddr 로 형변환을 해서 사용해야 한다. 형변환된 데이터를 받아들인 함수는 sa_family 값을 이용해서 데이터의 종류를 알아낼 수 있다.
AF_UNIX에서의 사용
struct sockaddr_un serveraddr; bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sun_family = AF_UNIX; strcpy(serveraddr.sun_path, argv[1]); if (bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) { perror("bind error : "); exit(0); } clilen = sizeof(clientaddr);
AF_INET에서의 사용
struct sockaddr_in serveraddr; server_sockfd = socket(AF_INET, SOCK_STREAM, 0); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr("218.234.19.87"); serveraddr.sin_port = htons(atoi(argv[1])); client_len = sizeof(serveraddr); if (connect(server_sockfd, (struct sockaddr *)&serveraddr, client_len) < 0) { perror("connect error :"); exit(0); }
struct sockaddr_in
AF_INET 도메인의 소켓에서 사용하는 구조체
<</usr/include/netinet/in.h struct sockaddr_in { __SOCKADDR_COMMON (sin_); /* sa_family_t sin_family */ in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr'. */ /* 결국 8 byte */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; };
'Network > Network' 카테고리의 다른 글
언제 shutdown()를 써야 하는가? (0) | 2011.11.23 |
---|---|
소켓 함수 모음 (0) | 2011.11.11 |
멀티캐스트 (Multicast) (0) | 2011.11.02 |
X25 와 TCP/IP (0) | 2011.08.26 |
NAS SAN SATA SCSI 방식 차이점 (0) | 2010.04.06 |