구조 sockaddr_un vs sockaddr
어떻게 있다.struct sockaddr
과는 다른struct sockaddr_un
?
저는 소켓을 소켓 주소에 바인딩하기 위해 클라이언트-서버 모듈에서 이러한 구조를 사용한다는 것을 알고 있습니다.그리고 우리는 구조를 수용하기 위해 캐스트 연산자를 사용합니다.sockaddr_un
.
둘이 얼마나 다르거나 비슷하고, 출연자가 왜 다른지 알고 싶습니다.
"sockaddr"은 일반적인 정의입니다.주소가 필요한 모든 소켓 기능에 사용됩니다.
"struct sockaddr_un"("Unix sockets" 주소)은 특정 종류의 주소 패밀리입니다.
"struct sockaddr_in"("인터넷 소켓" 주소)은 더 일반적으로 볼 수 있는 다른 종류의 주소 패밀리입니다.
캐스트는 소켓 API가 실제로 여러 실제 유형 중 하나가 될 공통 매개 변수 유형을 허용하는 것입니다.
다음은 여러 가지 다양한 주소 패밀리 정의를 보여주는 좋은 링크입니다.
http://www.cas.mcmaster.ca/ ~qiao/graphics/cs3mh3/graphics/graphics.graphics
A struct sockaddr
일반적으로 포인터의 기본 유형으로만 사용해야 합니다.주소 패밀리별 소켓 주소 유형에서 멤버들의 공통 초기 순서를 포괄하기 위한 구조입니다 (struct sockaddr_un
,struct sockaddr_in
,struct sockaddr_in6
등)
의지할 수 있는 유일한 멤버.struct sockaddr
가지는 것은 싱글입니다.sa_family_t
, 소켓 주소 패밀리를 나타냅니다.이 아이디어는 일종의 다형성을 얻기 위해 여러 소켓 주소 유형에서 작동할 수 있는 함수를 가질 수 있다는 것입니다.
void foo(struct sockaddr *sa)
{
switch(sa->sa_family)
{
case AF_INET: {
struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;
/* AF_INET processing */
}
case AF_UNIX: {
struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;
/* AF_UNIX processing */
}
/* ... */
위와 같은 코드는 일반적으로 C의 "엄격한 앨리어싱" 규칙을 어기는 것으로 간주되지만, 자신의 코드에서 이를 수행하려면 유니언 유형을 사용해야 합니다.
union sockaddr {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_un sun;
/* ... */
};
void foo(union sockaddr *sa_union)
{
struct sockaddr *sa = (struct sockaddr *)sa_union;
switch(sa->sa_family)
{
case AF_INET: {
struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;
/* AF_INET processing */
}
case AF_UNIX: {
struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;
/* AF_UNIX processing */
}
/* ... */
언급URL : https://stackoverflow.com/questions/3689925/struct-sockaddr-un-vs-sockaddr
'programing' 카테고리의 다른 글
Ajax에서 POST 데이터 크기 제한이 있습니까? (0) | 2023.09.09 |
---|---|
Angular CLI 6: angular.json에서 Sass 컴파일을 추가하려면 어떻게 해야 합니까? (0) | 2023.09.09 |
UI 레이블에서 텍스트의 픽셀 너비 (0) | 2023.09.09 |
같은 순서로 두 개의 목록을 한 번에 섞기 (0) | 2023.09.09 |
앵커 링크를 클릭 불가능 또는 비활성화하려면 어떻게 해야 합니까? (0) | 2023.09.09 |