Не удается открыть сокет SSDP в Windows XP, если он уже открыт другим приложением - PullRequest
0 голосов
/ 14 июня 2011

Я хочу прослушивать многоадресные рассылки SSDP на порт 1900. Порт уже открыт службой обнаружения Windows.Я не могу связать свой сокет, несмотря на использование опции сокета SO_REUSEADDR.Я запускаю заявку от имени администратора.

Если я остановлю службу, запустите мое приложение, а затем перезапустите службу, и оба получат сообщения.Что я делаю не так?

static SOCKET CreateSocket(const char *ccAddress, unsigned short ulPort, struct IfPoolItem *item) {
struct sockaddr_in sAddr;
struct ip_mreq mc_req;
SOCKET sRet;
char cSockParam = TRUE;

/* create a socket */
if((sRet = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)
{
    return(INVALID_SOCKET);
}

item->s = sRet;

if (setsockopt(sRet, IPPROTO_IP, SO_REUSEADDR, &cSockParam, sizeof(cSockParam)) == -1) {
    int iTmp = WSAGetLastError();
    return (INVALID_SOCKET);
}

/* bind the socket to the given port */
memset(&sAddr, 0, sizeof(sAddr));
sAddr.sin_family = AF_INET;
sAddr.sin_addr.s_addr = inet_addr(item->szIP);
sAddr.sin_port = htons(ulPort);
if(bind(sRet, (struct sockaddr *)&sAddr, sizeof(sAddr)) == SOCKET_ERROR)
{
    int iTmp = WSAGetLastError();
    closesocket(sRet);
    return(INVALID_SOCKET);
}

cSockParam = 4;
if (setsockopt(sRet, IPPROTO_IP, IP_MULTICAST_TTL, &cSockParam, sizeof(cSockParam)) == -1) {
    int iTmp = WSAGetLastError();
    return (INVALID_SOCKET);
}

/* Construct an IGMP join request structure */
mc_req.imr_multiaddr.s_addr = inet_addr(ccAddress);
mc_req.imr_interface.s_addr = inet_addr(item->szIP);

/* Send an ADD_MEMBERSHIP message via setsockopt */
if((setsockopt(sRet, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *) &mc_req, sizeof(mc_req))) == -1) {
    int iTmp = WSAGetLastError();
    return (INVALID_SOCKET);
}

/* Return the created socket. */
return(sRet);

}

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Я не эксперт по сокетам, но если вы посмотрите на эту страницу MSDN , она говорит, что SO_REUSEADDR должен использоваться с параметром level = SOL_SOCKET.Поэтому, вероятно, ваш звонок должен быть примерно таким:

setsockopt(sRet, SOL_SOCKET, SO_REUSEADDR,&cSockParam, sizeof(cSockParam))

Пожалуйста, попробуйте это и дайте мне знать, если это что-то изменило

0 голосов
/ 15 июня 2011

Я не совсем уверен, что это ваша проблема, но WDS может использовать SO_EXCLUSIVEADDRUSE , которая препятствует вашему bind (). Документы в этой ссылке, по-видимому, описывают поведение, о котором вы сообщаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...