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 は取得していません。