UPnP: сообщение об обнаружении отправлено, но ответа не получено

Я пытаюсь получить список доступных сервисов UPnP. Я отправляю сообщение об обнаружении, но не могу получить ответ. 192.168.1.228 — это IP-адрес компьютера, отправляющего сообщение об обнаружении. Я также попробовал 127.0.0.1 и 192.168.0.1, но я все еще не получил ответа. Это код, который я использую:

    std::vector<std::string> UPnPDiscovery::discoverDevices(const std::string &searchTarget)
{
// Structs needed
struct in_addr localInterface;
struct sockaddr_in groupSock;
struct sockaddr_in localSock;
struct ip_mreq group;

std::vector<std::string> devices; // devices found

int udpSocket;

// Create the Socket
udpSocket = socket(AF_INET, SOCK_DGRAM, 0);

// Enable SO_REUSEADDR to allow multiple instances of this application to receive copies of the multicast datagrams.
int reuse = 1;
setsockopt(udpSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse));

// Initialize the group sockaddr structure with a group address of 239.255.255.250 and port 1900.
memset((char *) &groupSock, 0, sizeof(groupSock));
groupSock.sin_family = AF_INET;
groupSock.sin_addr.s_addr = inet_addr("239.255.255.250");
groupSock.sin_port = htons(1900);

// Disable loopback so you do not receive your own datagrams.
char loopch = 0;
setsockopt(udpSocket, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof(loopch));

// Set local interface for outbound multicast datagrams. The IP address specified must be associated with a local, multicast capable interface.
localInterface.s_addr = inet_addr("192.168.1.228");

setsockopt(udpSocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface));

// Bind to the proper port number with the IP address specified as INADDR_ANY.
memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(33589);
localSock.sin_addr.s_addr = INADDR_ANY;
bind(udpSocket, (struct sockaddr*)&localSock, sizeof(localSock));

// Join the multicast group on the local interface. Note that this IP_ADD_MEMBERSHIP option must be called for each local interface over which the multicast datagrams are to be received.
group.imr_multiaddr.s_addr = inet_addr("239.255.255.250");
group.imr_interface.s_addr = inet_addr("192.168.1.228");
setsockopt(udpSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group));

char buff[]= "M-SEARCH * HTTP/1.1\r\n"\
"HOST: 239.255.255.250:1900\r\n"\
"MAN: \"ssdp:discover\"\r\n"\
"MX: 3\r\n"\
"ST: udap:rootservice\r\n"\
"USER-AGENT: RTLINUX/5.0 UDAP/2.0 printer/4\r\n\r\n";

int  ret1 = sendto(udpSocket, buff, strlen(buff), 0, (struct sockaddr*)&groupSock, sizeof groupSock);

char discovery_response_buffer[1024] = {};
struct sockaddr_in si_other;
socklen_t slen = sizeof(si_other);
while(true){

recvfrom(udpSocket, discovery_response_buffer, 1024, 0, (struct sockaddr *) &si_other, &slen) < 0) { //TODO: edw na valw recv timeout
perror("recvfrom - device discovery";
break;
}
}
if (close(udpSocket) < 0) {
perror("close");
}
return devices;
}

Можете ли вы помочь мне выяснить, что я здесь делаю не так? Спасибо

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]