私はC++でUpNPを実装しようとしていますが、グーグルでいくつかのソースを見つけましたが、どれも機能しませんでした。これは機能していることがわかりました(http://www.codeproject.com/KB/IP/upnplib.aspx)が、.NET用であるため、ネットワークをスニッフィングしてコードの動作を確認し、同じことを行うことにしました。ソケット。
結果は次のとおりです(フルサイズ:http://i.stack.imgur.com/eLoHK.jpg):
これは、パケットが悪く見えないことを示しています。すべてが同じように見えます。コードの送信元アドレスを除いて、制御方法がわかりません(コードとfinder.net.exeの両方がテストされています)。同じネットワークに接続された同じコンピュータ上)。
これが私のコードです:
#define upnp_broadcast_ip "239.255.255.250"
#define upnp_broadcast_port 1900
#define upnp_search_request "M-SEARCH * HTTP/1.1\r\n" \
"Host:239.255.255.250:1900\r\n" \
"ST:upnp:rootdevice\r\n" \
"Man:\"ssdp:discover\"\r\n" \
"MX:3\r\n" \
"\r\n"
WSAStartup(MAKEWORD(2, 2), &WsaData);
BOOL discover( )
{
SOCKET ConnectSocket;
struct sockaddr_in Addr;
char Buffer[1450];
int t = 0,
iResult = 0,
TrueLen = sizeof(bool);
bool True = true;
ulong One = 1;
// Open datagram socket
ConnectSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
// Clear out struct
memset( &Addr, 0, sizeof(Addr) );
// Specify the address family, IP address, and port
Addr.sin_family = AF_INET;
Addr.sin_port = htons( upnp_broadcast_port );
Addr.sin_addr.s_addr = inet_addr( upnp_broadcast_ip );
iResult = setsockopt( ConnectSocket, SOL_SOCKET, SO_BROADCAST, (char*)&True, TrueLen ); // Not sure what is this for
// Transmit data
int sent = sendto( ConnectSocket, upnp_search_request, strlen(upnp_search_request), 0, (struct sockaddr*)&Addr, sizeof(Addr) );
// Try to receive data 10 times
for( t = 0; t < 10; t++ )
{
ioctlsocket( ConnectSocket, FIONBIO, &One );
// Clear out buffer
memset( &Buffer, 0, sizeof(Buffer) );
int length = sizeof(Addr);
// Receive data
iResult = recvfrom( ConnectSocket, Buffer, (sizeof(Buffer) - 1), 0, (struct sockaddr*)&Addr, &length );
if( iResult == SOCKET_ERROR)
{
Sleep( 1000 );
continue;
} else {
// Do stuff with received data
}
}
closesocket( ConnectSocket );
return FALSE;
}
コードを読みやすくするために、すべてのWSAGetLastError()エラーチェックを削除しました。recvfromまではすべて正常に実行され、常に-1が返され、strerror(WSAGetLastError())は「不明なエラー」を出力します。
誰かが私を正しい方向に導いてくれることを願っています。私はこの2日間、この仕事をしようとしてきました。