2012-04-09 103 views
3

我目前正在研究一個UDP應用程序,允許兩個用戶使用winsock librarary與海誓山盟對話。目前,當我的程序運行時,它首先將sockaddress保存到一個向量中,然後當用戶發送消息時,它會將該地址與向量中的第一個地址進行比較。當我調試和比較值進行比較,他們是完全一樣的但我如果statment轉到其他(它認爲該地址不等於對方)問題與比較套接字地址

這是我的代碼有:

#include <WinSock2.h> 

sockaddr clientAddress; 

recvfrom(hSocket, msg, MAXLINE, 0, &clientAddress, &cbClientAddress); 

myVector.pushback(clientAddress); 

if (&clientAddresses[0] == &clientAddress) 
{ 
//is the same address 
} 
else 
{ 
//not the same address 
} 

香港專業教育學院還試圖更加具體使用.sa_dataclientAddress[0]&clientAddress.

感謝後

+1

我懷疑周圍cbClientAddress'的'初始化(這應該是類型'socklen_t'和比較錯誤的長度問題,您應該調用之前initializating這個變量爲'的sizeof(clientAddress)''來recvfrom',然後比較結構中實際使用的字節數,而不是比較整個結構。你能告訴我如何初始化'cbClientAddress'? – Celada 2012-04-10 00:05:10

+0

@Celada我在添加變量之前初始化變量sizeof(clientAddress)我只是使用clientAddress作爲連接的唯一標識符 – user1219627 2012-04-10 00:11:02

+1

順便說一句,我強烈建議不要這樣做,除非你別無選擇。你應該只使用源地址作爲回覆的地址,用於記錄/授權目的除非你別無選擇,否則決不能用它來識別客戶。 – 2012-04-10 00:12:35

回答

1

的多個問題:

  • 調用recvfrom之前,你需要初始化cbClientAddress(的socklen_t類型)你是準備好接收地址信息的字節數,像這樣:

    struct sockaddr clientAddress; 
    socklen_t cbClientAddress; 
    
    cbClientAddress = sizeof(clientAddress); 
    recvfrom(hSocket, msg, MAXLINE, 0, &clientAddress, &cbClientAddress); 
    
  • 呼叫後,cbClientAddress將被覆蓋所收到地址的實際長度。這將比sizeof(struct sockaddr)短。實際上它將等於sizeof(struct sockaddr_in),因爲這是一個UDP/IP套接字。

  • 您必須只比較實際包含數據的結構部分,而不是整個結構。結構中未使用的部分(大小在struct sockaddr_instruct sockaddr之間的差異)可能是垃圾。你不想比較它。這將不僅需要記憶結構本身在矢量中的內容,而且還要記住重要的長度。

  • 當比較保存的地址和剛收到的地址時,使用這種僞代碼。不要試圖比較整個結構(包括未使用的部分)。

    if (
        (saved_length == this_length) && 
        (memcmp(saved_sockaddr, this_sockaddr, this_length) == 0) 
    ) { 
        it's a match 
    } 
    
  • 您的代碼&clientAddresses[0] == &clientAddress檢查結構的地址是否相等。這意味着你正在測試,看看它是不是相同的結構而不是你想要的,這是測試它是否是一個具有相同內容的結構。根據上面的僞代碼使用memcmp來比較內容。