2012-04-09 96 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来比较内容。