我目前正在开发一个UDP应用程序,它允许两个用户使用winsock库提供相互通信。目前,当我的程序运行时,它首先将sockaddress保存到向量,然后当用户发送消息时,它将地址与向量中的第一个地址进行比较。当我调试并比较被比较的值时,它们完全相同但我的if语句转到else(它认为地址彼此不相等)
这是我的代码:
#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_data
和clientAddress[0]
&clientAddress.
更具体一点
由于
答案 0 :(得分: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_in
和struct sockaddr
之间的大小差异)可能是垃圾。你不想比较它。这不仅需要在矢量中记忆结构本身的内容,而且需要很长的时间。
将保存的地址与刚收到的地址进行比较时,请使用此类伪代码。不要试图比较整个结构(包括拖尾未使用的部分)。
if (
(saved_length == this_length) &&
(memcmp(saved_sockaddr, this_sockaddr, this_length) == 0)
) {
it's a match
}
您的代码&clientAddresses[0] == &clientAddress
会检查结构的地址是否相等。这意味着您正在测试它是否是相同的结构而不是您想要的,这是测试它是否是具有相同内容的结构。根据上面的伪代码使用memcmp
来比较内容。