gpt4 book ai didi

c++ - Socket发送数据但收不到响应

转载 作者:行者123 更新时间:2023-11-30 03:07:05 24 4
gpt4 key购买 nike

我正在尝试用 C++ 实现 UpNP,我在谷歌上找到了一些资源,但没有一个有效。我发现这个工作正常 ( http://www.codeproject.com/KB/IP/upnplib.aspx ) 但它是针对 .NET 的,所以我决定嗅探网络以查看代码在做什么,然后对套接字执行相同的操作。

这是结果(全尺寸:http://i.stack.imgur.com/eLoHK.jpg): enter image description here

这表明数据包看起来不错,一切似乎都一样,除了我的代码的源地址,我不知道如何控制(我的代码和 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()) 打印“未知错误”。

我希望有人能指导我正确的方向,过去两天我一直在努力完成这项工作。

最佳答案

为什么要广播? UPnP 使用多播,据我所知(Unix)你应该使用 setsockopt() 来请求内核加入多播组。我不确定 Windows,它可能是同一个调用。像这样的东西:

 struct ip_mreq mreq;
....
mreq.imr_multiaddr.s_addr=inet_addr(GROUP_IP);
mreq.imr_interface.s_addr=htonl(INADDR_ANY);

setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))

关于c++ - Socket发送数据但收不到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6051178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com