2015-03-31 25 views
1

我剛開始學習套接字編程,並在connect()函數中發現了這個不尋常的參數。套接字編程 - 連接中參數的含義()

(struct sockaddr *)&server 

片斷插座()函數:

if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0) 
{ 
    puts("connect error"); 
    return 1; 
} 
+0

可能的重複[爲什麼我們在調用bind()時將sockaddr \ _in轉換爲sockaddr?](http://stackoverflow.com/questions/21099041/why-do-we-cast-sockaddr-in-to- sockaddr-when-calling-bind) – edmz 2015-03-31 18:37:45

+0

當你的問題是關於'connect()'的時候,爲什麼你會提到'socket()'三次? – EJP 2015-03-31 19:18:31

+0

你的問題是什麼? – Julian 2015-03-31 19:22:25

回答

1

server是要連接的主機的IP地址。如果是IPv4套接字,則應使用struct sockaddr_in*強制轉換爲struct sockaddr*,如果是IPv6套接字,則應使用struct sockaddr_in6*強制轉換爲struct sockaddr*

+0

不,我只是混淆了語法和鑄造等...請幫助我... – Kishor 2015-03-31 17:38:11

+0

嗯,它期望你給一個指針,因此'&服務器',而不是'服務器'。而且因爲它用於所有具有不同'sockaddr_foo'結構的協議,所以您將其轉換爲'struct sockaddr *',這是所有協議的通用結構。因此'(struct sockaddr *)&server'。 – juhist 2015-03-31 17:44:40

+0

也許這有助於:http://stackoverflow.com/questions/21099041/why-do-we-cast-sockaddr-in-to-sockaddr-when-calling-bind – Downvoter 2015-03-31 17:46:31

1

sockaddr結構用於存儲參與Windows套接字通信的計算機的Internet協議(IP)地址。客戶端使用connect()函數來連接服務器。所以,第二個參數基本上充滿服務器的IP和端口信息,讓客戶可以通過IP地址和端口

+0

不,我只是混淆了語法和鑄造和這樣...請幫助我 – Kishor 2015-03-31 17:41:43

2

標識的服務器連接。如果你是爲什麼指針server,我以爲是sockaddr_in類型的困惑不傳遞給函數,而是它被轉換爲指針,以struct sockaddr,那麼這裏就是你的答案:

struct sockaddr_in只是爲struct sockaddr的包裝結構:

struct sockaddr { 
    unsigned short sa_family; 
    char   sa_data[14]; 
}; 

的端口號和IP地址舉行t一起在這裏。它們在sa_data[14]中保持在一起 - 第一個2 bytes保存端口號,而下一個4 bytes保存ip地址。其餘8 bytes未使用。這些是您使用sockaddr_in時通過sin_zero[8]清除爲零的8 bytes

connect()這樣的功能不知道任何類型的struct sockaddr_in,他們只知道struct sockaddr