如果已被其他应用程序打开,则无法在Windows XP上打开SSDP套接字

问题描述

| 我想在端口1900上侦听SSDP多播。该端口已由Windows discovery Service打开。即使使用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,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,IP_MULTICAST_TTL,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,IP_ADD_MEMBERSHIP,(char FAR *) &mc_req,sizeof(mc_req))) == -1) {
    int iTmp = WSAGetLastError();
    return (INVALID_SOCKET);
}

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

解决方法

        我不是套接字专家,但是如果您查看此msdn页面,它说SO_REUSEADDR应该与level = SOL_SOCKET参数一起使用。所以大概你打来的电话应该像
setsockopt(sRet,SOL_SOCKET,SO_REUSEADDR,&cSockParam,sizeof(cSockParam))
请尝试此操作,让我知道它是否有作用     ,        我不确定这是否是您的问题,但是WDS可能正在使用SO_EXCLUSIVEADDRUSE阻止了bind()。此链接中的文档似乎描述了您要举报的行为。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...