我想在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和字符串错误(WSAGetLastError())打印“未知错误”。
我希望有人能指引我走向正确的方向,我已经是最后两天尝试做这项工作了。
恕我直言,你不应该改变的问题这么厉害:你可以得到你要寻找的IP地址的方式创建一个新的问题,但现在,标题是误导你得到了一个原始问题的答案... – rlc 2011-05-19 00:22:14