1

就 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 没有。

4

0 回答 0