就 UDP 协议和通过网络发送/接收数据而言,我是这个环境的新手。我已阅读有关此类问题的另一篇文章,但我不确定如何解决我的问题:
我刚刚将 PC 从 XP 升级到 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 流输出的wireshark:
Source: 192.168.2.87
Destination: 192.168.2.255
Protocol: UDP Info:
Sorce Port: 6601 Destination Port: 6601
我已经尝试对我的 c 代码进行硬编码以听取我能想到的任何可能性,也就是 sender addr 函数:
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 流--->发送到 192.168.2.87--->在 192.168.2.255 上广播--->这些计算机中的任何一台都没有改变......然后我有两台计算机(一台 XP 和一台 Windows 7)比听 2.255 ip。XP 正在获取 UDP,而 Win7 没有。