Skip to content

Instantly share code, notes, and snippets.

@envyen
Created September 23, 2021 11:05
Show Gist options
  • Save envyen/3f8bb1218ed7baf216391d695d98414f to your computer and use it in GitHub Desktop.
Save envyen/3f8bb1218ed7baf216391d695d98414f to your computer and use it in GitHub Desktop.
SSDP/UPnP Discover Device IP from Windows
// Windows CPP SSDP/UPNP search 230921
#pragma comment(lib, "Ws2_32.lib") // for socket
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <sys/types.h>
#include <string.h>
constexpr auto SERVERPORT = 1900;
constexpr auto SSDP_GROUP = "239.255.255.250";
const 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: ssdp:all\r\n"
"\r\n";
int main()
{
char rcvdbuff[1000];
int Ret = 2;
int len;
WSADATA wsaData;
struct sockaddr_in their_addr;
SOCKET sock;
WSAStartup(MAKEWORD(2, 2), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
their_addr.sin_family = AF_INET;
their_addr.sin_addr.s_addr = inet_addr(SSDP_GROUP);
their_addr.sin_port = htons(SERVERPORT);
len = sizeof(struct sockaddr_in);
printf("Search:\n%s\n", buff);
while (1)
{
Ret = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&their_addr, len);
if (Ret < 0)
{
printf("error in SENDTO() function");
closesocket(sock);
return 0;
}
//Receiving
memset(rcvdbuff, 0, sizeof(rcvdbuff));
Ret = recvfrom(sock, rcvdbuff, sizeof(rcvdbuff), 0, (struct sockaddr*)&their_addr, &len);
if (Ret < 0){
printf("Error in Receiving");
return 0;
}
rcvdbuff[Ret - 1] = '\0';
//printf("RECEIVED: %s\n\n", rcvdbuff);
/* Parse valid responses to get IP */
char host[1025];
char* url_start, * host_start, * host_end;
if (strncmp(rcvdbuff, "HTTP/1.1 200 OK", 12) == 0) {
/* Skip ahead to url in SSDP response */
if ((url_start = strstr(rcvdbuff, "LOCATION:" )) != NULL) {
/* Get hostname/IP address in SSDP response */
if ((host_start = strstr(url_start, "http://")) != NULL) {
host_start += 7; /* Move past "http://" */
if ((host_end = strstr(host_start, ":")) != NULL) {
strncpy_s(host, host_start, host_end - host_start);
host[host_end - host_start] = '\0';
printf("HOST IP: %s\n", host);
}
}
}
}else{
fprintf(stderr, "[Unexpected SSDP response]\n");
}
Sleep(5 * 1000);
}
closesocket(sock);
WSACleanup();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment