我剛開始學習套接字編程,並在connect()
函數中發現了這個不尋常的參數。套接字編程 - 連接中參數的含義()
(struct sockaddr *)&server
片斷插座()函數:
if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
{
puts("connect error");
return 1;
}
我剛開始學習套接字編程,並在connect()
函數中發現了這個不尋常的參數。套接字編程 - 連接中參數的含義()
(struct sockaddr *)&server
片斷插座()函數:
if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
{
puts("connect error");
return 1;
}
的server
是要連接的主機的IP地址。如果是IPv4套接字,則應使用struct sockaddr_in*
強制轉換爲struct sockaddr*
,如果是IPv6套接字,則應使用struct sockaddr_in6*
強制轉換爲struct sockaddr*
。
不,我只是混淆了語法和鑄造等...請幫助我... – Kishor 2015-03-31 17:38:11
嗯,它期望你給一個指針,因此'&服務器',而不是'服務器'。而且因爲它用於所有具有不同'sockaddr_foo'結構的協議,所以您將其轉換爲'struct sockaddr *',這是所有協議的通用結構。因此'(struct sockaddr *)&server'。 – juhist 2015-03-31 17:44:40
也許這有助於:http://stackoverflow.com/questions/21099041/why-do-we-cast-sockaddr-in-to-sockaddr-when-calling-bind – Downvoter 2015-03-31 17:46:31
sockaddr
結構用於存儲參與Windows套接字通信的計算機的Internet協議(IP)地址。客戶端使用connect()
函數來連接服務器。所以,第二個參數基本上充滿服務器的IP和端口信息,讓客戶可以通過IP地址和端口
不,我只是混淆了語法和鑄造和這樣...請幫助我 – Kishor 2015-03-31 17:41:43
標識的服務器連接。如果你是爲什麼指針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
。
可能的重複[爲什麼我們在調用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
當你的問題是關於'connect()'的時候,爲什麼你會提到'socket()'三次? – EJP 2015-03-31 19:18:31
你的問題是什麼? – Julian 2015-03-31 19:22:25