就UDP协议和通过网络发送/接收数据而言,我是这个环境的新手。我已经阅读了关于此类问题的其他帖子,但我不确定如何解决我的问题:
我刚从XP将PC升级到Windows 7。此升级是由于我的应用程序需要在Win7上运行。我没有改变我们的UDP流被广播。通过升级,我无法再运行我的应用程序的旧版本,因为UDP流不会连接到我的应用程序。
我已关闭所有防火墙,并以管理员身份运行所有内容。
这就是我的设置:
代码在ip:192.168.2.1上运行 UDP从192.168.2.1发送到192.168.2.87,然后广播到192.168.2.255
我曾经能够在单独的计算机上看到这个UDP流与我的旧应用程序:192.168.2.12
如果我更改我的UDP流直接转到192.168.2.12 ip,那么我的应用程序可以工作,但是UDP不再被广播。我需要UDP才能被多台计算机读取。
这是我为UDP Stream输出的wireshark:
Source: 192.168.2.87
Destination: 192.168.2.255
Protocol: UDP Info:
Sorce Port: 6601 Destination Port: 6601
我试过硬编码我的c代码来听我能想到的任何可能性,也就是发送者地址函数:
senderAddr.sin_addr.s_addr = htonl(INADDR_ANY);
类似于:
senderAddr.sin_addr.s_addr = inet_addr("192.168.2.212")
这是初始化I / O缓冲区的代码:
// UDP Receiver Declarations -
SOCKET SockIn = INVALID_SOCKET;
SOCKADDR_IN senderAddr;
int senderSize = sizeof(senderAddr);
u_short PortIn = 6601;
int timeout = 1;
//===================<Callbacks::Callbacks>==================
//
// Summary: Constructor
//
//=============================================================================
Callbacks::Callbacks(RTUserIntegrationI &a_rIntegration)
: m_rIntegration(a_rIntegration)
, m_pUDPInput(NULL)
{
}
//=====================<Callbacks::~Callbacks>===============
//
// Summary: Destructor
//
//=============================================================================
Callbacks::~Callbacks()
{
}
//=====================<Callbacks::InitIOBuffers>====================
//
// Summary: Init function for the IO buffer
//
//=============================================================================
void Callbacks::vInitIOBuffers()
{
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
WSADATA WSAData;
UInt Size = 0;
// UDP Declarations -
// Initialize the member pointers to buffers
bufferin = m_rIntegration.pGetIOBuffer(Input_Buffer);
if (bufferin != NULL)
m_pUDPInput = static_cast<InputData*>(bufferin->pGetDataAddress(Size));
// UDP Receive -
if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
{
printf("\nCould not open WSA connection");
WSACleanup();
}
SockIn = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (SockIn == INVALID_SOCKET)
{
printf("\nCould not create socket.");
closesocket(SockIn);
WSACleanup();
}
senderAddr.sin_family = AF_INET;
senderAddr.sin_port = htons(PortIn);
senderAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if (setsockopt(SockIn, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptVal, bOptLen) != INVALID_SOCKET)
{
printf("\nSet SO_REUSEADDR: ON.");
}
if (bind(SockIn, (struct sockaddr *) &senderAddr, senderSize) == -1)
{
printf("\nCould not bind socket.");
closesocket(SockIn);
WSACleanup();
}
setsockopt(SockIn, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout, sizeof(timeout));
}
我将接收端口号硬编码为6601。
上面的代码工作正常,计算机在Windows XP中查看和读取广播的UDP,但在Windows 7中停止工作。
任何建议都将不胜感激。
增加:
192.168.2.1生成UDP流---&gt;发送到192.168.2.87 ---&gt;广播于192.168.2.255 ---&gt;任何这些计算机上的Notheing都发生了变化.......然后我有两台计算机(一台XP和一台Windows 7),而不是听2.255 ip。 XP正在获得UDP而Win7则没有。