본문 바로가기

프로그래밍/ 리눅스

소켓 : 유닉스 도메인

유닉스 도메인 소켓 주소는 같은 호스트에서 수행되는 응용프로그램간의 통신을 수행한다.

tcp, udp 를 지원한다.

파일 시스템에서 경로명으로 소켓을 지정한다.

 

 

 

유닉스 도메인 소켓 주소 : struct sockaddr_un

struct sockaddr_un {

// 접두어 sun은 socket unix의 첫글자를 따온것이다.

sa_family_t sun_family; // 항상 AF_UNIX

char sun_path[108]; // 널로 종료되는 소켓 경로명

}

 

유닉스 도메인 소켓을 주소로 결속 시키려면 sockaddr_un 구조체를 초기화 한 뒤 bind의 addr 인자로 캐스팅해 넘겨준다

 

struct sockaddr_un addr;

memset(&addr, 0, sizeof( struct sockaddr_un ) );

addr.sun_family = AF_UNIX;

strncpy(addr.sun path, 경로, sizeof(addr.sun_path) - 1 );

bind( ... ) ...

 

* 이미 존재하는 경로명은 불가능 ( EADDRINUSE 에러 리턴 )

* 일반적으로 절대 경로명으로 소켓 결속

 

 

 

유닉스 도메인의 데이터그램 소켓

유닉스 도메인의 데이터그램 소켓은 안전하다 ipv4나 ipv6를 이용한 경우에만 안정적이지 않다.

도메인 소켓의 전송은 커널 내에서 수행되므로 모든 메시지는 순서대로 전달되고 중복도 발생하지 않는다.

 

유닉스 도메인의 데이터그램 소켓의 최대 크기는 지정되어 있지 않다.

 

 

socketpair() 은 유닉스도메인에서만 사용 가능하다. (AF_UNIX)

#include <sys/socket.h>

int socketpair( AF_UNIX, SOCK_DGRAM or SOCK_STREAM, 0 (protocol), int sockfd[2] );

socketpair를 호출한 뒤 프로세스는 fork()로 자식을 생성.

자식은 부모 소켓 쌍을 가리키는 디스크립터도 포함한 복사본을 상속 받는다. 부모와 자식은 IPC에 소켓 쌍 사용 가능.

 

 

리눅스 추상 소켓 이름 공간(abstarct namespace)

* 리눅스 고유 기능이다.

* 파일 시스템에 해당 이름을 생성 할 필요 없이 결속 할 수 있게 해준다.

* 기존 이름과 충돌 가능성 없음

* 소켓 사용 뒤 경로명의 링크 제거 할 필요 없음

 

사용하기 위해선 sun_path 필드의 첫 바이트를 널(\0) 바이트로 만든다

 

struct sockaddr_un addr;

memset(&addr, 0, sizeof( struct sockaddr_un ) );

addr.sun_family = AF_UNIX;

 

strPath = "xyz";

strncpy(addr.sun path[1], strPath , strlen(strPath) );

 

 

 

 

'프로그래밍 > 리눅스' 카테고리의 다른 글

프로세스  (0) 2013.03.24
파일디스크립터..  (0) 2013.03.24
리눅스 API의 모든것  (0) 2013.03.20
리눅스에서 안드로이드 테더링  (0) 2013.03.20
리눅스에서 컴파일하기!  (0) 2013.03.20