2014-05-21 3 views
1

내 코드가 열린 소켓으로 전달됩니다. 이 소켓은 TCP 소켓 (AF_INET)이거나 Unix 도메인 소켓 (AF_UNIX) 일 수 있습니다.오픈 소켓이 TCP 또는 유닉스 도메인 소켓인지 어떻게 알 수 있습니까?

소켓의 도메인에 따라 다르게 처리해야합니다. 특히 소켓이 주소에 바인딩되어있는 경우에는 accept 들어오는 연결을 다른 방식으로 사용할 수 있습니다.

내가 전달한 소켓이 유닉스 도메인 소켓인지 또는 TCP 소켓인지를 확인하는 가장 좋은 방법은 무엇입니까? 이 솔루션은 적어도 OS X 및 Linux에서 작동해야합니다.

getsockopt은 소켓 유형 (예 : SOCK_STREAM 등)을 가져올 수는 있지만 도메인은 허용하지 않는 것으로 보입니다.

getsockname는 OSX에 유닉스 도메인 소켓을위한 제로 길이를 반환하지만이 공식적으로 bug 리눅스 동작은 different입니다.

답변

1

getsockname에 의해 반환 된 struct sockaddr의 첫 번째 멤버는 sa_family이며, 기호 상수와 비교하여 테스트합니다. OSX의 버그로 인해 반환 된 주소 구조가 0 바이트 일 때 유닉스 도메인으로 가정하고, 다른 플랫폼과 도메인에서는 반환 된 구조 만 확인하면됩니다.

1

getsockname()은 로컬로 연결된 주소와 주소 패밀리에 대해 소켓을 쿼리하는 유일한 크로스 플랫폼 소켓 API입니다.

Windows에서 적어도 getsockopt(SOL_SOCKET, SO_PROTOCOL_INFO)을 사용하면 필드가있는 WSAPROTOCOL_INFO 구조체를 검색 할 수 있습니다. 어쩌면 다른 OS에 유사한 플랫폼 별 API가있을 수 있습니다.