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

考えられるあらゆる可能性、別名送信者 addr 関数をリッスンするために、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 ストリームを生成します---> 192.168.2.87 に送信されます---> 192.168.2.255 でブロードキャストされます ---> これらのコンピューターのいずれでも何も変更されていません........ 私は 2 台のコンピューターを持っています ( 2.255 ip をリッスンするよりも 1 つの XP と 1 つの Windows 7)。XP は UDP を取得していますが、Win7 は取得していません。

4

0 に答える 0