2011-07-25 26 views
3

我無法理解有關Unix域套接字的bind()函數。C編程 - 瞭解綁定()

address.sun_family = AF_UNIX; 
addrlen = sizeof(address.sun_family) + strlen(SOCK_PATH); 
. 
. 
. 
bind(socket_fd, (struct sockaddr *) &address, addrlen) != 0) 

正如我現在明白了,這需要的是與插座()創建的socket_fd(位於進程命名空間),和「適用」,載於地址插座上的地址信息。基本上創建它,以便其他進程可以使用它....我認爲這是正確的。

我不明白的是需要addrlen參數。這是沒有前導/尾隨空字節的地址結構的長度。正確?這個參數是否需要告訴bind()要讀出多少字節的地址?

感謝您的洞察!

回答

1

不知道爲什麼你的addrlen中設置這樣的,正確的/常用的方法是:

memset(&addr, 0, sizeof(struct sockaddr_un)); 
         /* Clear structure */ 
    addr.sun_family = AF_UNIX; 
    strncpy(addr.sun_path, MY_SOCK_PATH, 
      sizeof(addr.sun_path) - 1); 

    if (bind(sfd, (struct sockaddr *) &addr, 
      sizeof(struct sockaddr_un)) == -1) { 
     perror("bind"); 
     exit(EXIT_FAILURE); 
    } 

注意使用的sizeof(),沒有的strlen/addrlen中預計

+0

好的..但我需要&addrlen作爲不可避免的accept()函數的第三個參數。那麼爲什麼我不能在bind()和accept()中使用它? –

+0

值是相同的(所以可以設置它),但是無論如何設置它都是無效的(正確地完成,它是'addrlen = sizeof(struct sockaddr_un);'只要你使用相同的套接字結構) – KevinDTimm

+0

在'accept'的情況下,addrlen既是輸入也是輸出 - 你指定你傳入的緩衝區的大小,內核告訴你連接到你的sockaddr有多大。 –

2

簡單地說,綁定對系統說:okay, from now on, any packet with destination {address->sun_addr} should be forwarded to my socket_fd, so I can read them

addrlen變元指定該結構的尺寸爲的尺寸爲,因爲可以傳遞不同類型的結構(不同尺寸)。例如,struct sockaddr_un*,struct sockaddr_in*。一個「普通」結構被傳遞,struct sockaddr*,因此bind不知道什麼是實際您的結構的類型。這就是爲什麼你必須通過這個長度。

PS:我確定你的意思是進程地址空間而不是進程名字空間

0

我還在學習,那是什麼把我帶到這裏,所以也許解釋我的理解也會幫助我學習,所以要疲倦,我可能是非常錯誤的,或者我可能會在正確的方向...

你需要它,因爲IPv4和IPv6地址是不同的長度,就像不同協議的地址一樣,我假設並不是所有的協議,如Apple Talk或火腿無線電協議都使用類似於IPv4樣式地址的地址,這些地址是一組4個字節,八位字節,我認爲它們被調用,用「。」分隔。所以當你調用「sizeof(struct sockaddr_in)」時,你傳遞的是一個「int」,它是sockaddr_in包含的字節數,它與sizeof(struct sockaddr_in)的「sizeof(struct sockaddr_in6)」不同)。 sockaddr_in用於inet或IPv4,* _in6用於inet6或IPv6,* _un用於Unix域套接字。我相信Unix域套接字地址是隻能用於本地進程通信的文件路徑。因此,對於其中一個,函數/方法需要知道套接字文件的位置,例如/ home/user/Pictures/socket,以便將其綁定到本地端口,因此可以將其綁定到strncopy和sun_path業務。這也可能適用於inet/6套接字,winsocks可能不同。 (在Windows上學習C/C++最接近我曾經的自殺)。

通過「sizeof(struct sockaddr_un)」傳遞的int可用於確定實際實現代碼中的執行模式。如果arg [2] = N,則執行此操作;否則,如果arg [2] = M,那麼可能...

如果您閱讀套接字手冊,您會看到示例使用「sizeof()」而不是addrlen。

注意: 當獲得協議地址結構的字節大小時,使用的結構實際上是否包含有用數據並不重要,只需要它的大小,這就是爲什麼結構在參數中實例化的原因,在新創建的結構體上使用「sizeof()」會返回你需要的int值,這就是第三個參數的參數。