⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssdp_device.c

📁 开发upnp 时的底层库,可以运行,主要是实现了upnp的底层协议 !
💻 C
📖 第 1 页 / 共 2 页
字号:
        free( msgs[2] );        return UPNP_E_OUTOF_MEMORY;    }    // send packets    if( RootDev ) {        // send 3 msg types        ret_code = NewRequestHandler( &DestAddr, 3, &msgs[0] );    } else                      // sub-device    {        // send 2 msg types        ret_code = NewRequestHandler( &DestAddr, 2, &msgs[1] );    }    // free msgs    free( msgs[0] );    free( msgs[1] );    free( msgs[2] );    return ret_code;}/************************************************************************* Function : SendReply									*																	* Parameters:	*	IN struct sockaddr_in * DestAddr:destination IP address.*	IN char *DevType: Device type*	IN int RootDev: 1 means root device 0 means embedded device.*	IN char * Udn: Device UDN*	IN char * Location: Location of Device description document.*	IN int  Duration :Life time of this device.*	IN int ByType:** Description:														*	This function creates the reply packet based on the input parameter, *	and send it to the client addesss given in its input parameter DestAddr.** Returns: int*	UPNP_E_SUCCESS if successful else appropriate error***************************************************************************/intSendReply( IN struct sockaddr_in *DestAddr,           IN char *DevType,           IN int RootDev,           IN char *Udn,           IN char *Location,           IN int Duration,           IN int ByType ){    int ret_code;    char *msgs[2];    int num_msgs;    char Mil_Usn[LINE_SIZE];    int i;    msgs[0] = NULL;    msgs[1] = NULL;    if( RootDev ) {        // one msg for root device        num_msgs = 1;        sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn );        CreateServicePacket( MSGTYPE_REPLY, "upnp:rootdevice",                             Mil_Usn, Location, Duration, &msgs[0] );    } else {        // two msgs for embedded devices        num_msgs = 1;        //NK: FIX for extra response when someone searches by udn        if( !ByType ) {            CreateServicePacket( MSGTYPE_REPLY, Udn, Udn, Location,                                 Duration, &msgs[0] );        } else {            sprintf( Mil_Usn, "%s::%s", Udn, DevType );            CreateServicePacket( MSGTYPE_REPLY, DevType, Mil_Usn,                                 Location, Duration, &msgs[0] );        }    }    // check error    for( i = 0; i < num_msgs; i++ ) {        if( msgs[i] == NULL ) {            free( msgs[0] );            return UPNP_E_OUTOF_MEMORY;        }    }    // send msgs    ret_code = NewRequestHandler( DestAddr, num_msgs, msgs );    for( i = 0; i < num_msgs; i++ ) {        if( msgs[i] != NULL )            free( msgs[i] );    }    return ret_code;}/************************************************************************* Function : DeviceReply									*																	* Parameters:	*	IN struct sockaddr_in * DestAddr:destination IP address.*	IN char *DevType: Device type*	IN int RootDev: 1 means root device 0 means embedded device.*	IN char * Udn: Device UDN*	IN char * Location: Location of Device description document.*	IN int  Duration :Life time of this device.* Description:														*	This function creates the reply packet based on the input parameter, *	and send it to the client address given in its input parameter DestAddr.** Returns: int*	UPNP_E_SUCCESS if successful else appropriate error***************************************************************************/intDeviceReply( IN struct sockaddr_in *DestAddr,             IN char *DevType,             IN int RootDev,             IN char *Udn,             IN char *Location,             IN int Duration ){    char *szReq[3],      Mil_Nt[LINE_SIZE],      Mil_Usn[LINE_SIZE];    int RetVal;    szReq[0] = NULL;    szReq[1] = NULL;    szReq[2] = NULL;    // create 2 or 3 msgs    if( RootDev ) {        // 3 replies for root device        strcpy( Mil_Nt, "upnp:rootdevice" );        sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn );        CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn,                             Location, Duration, &szReq[0] );    }    sprintf( Mil_Nt, "%s", Udn );    sprintf( Mil_Usn, "%s", Udn );    CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn,                         Location, Duration, &szReq[1] );    sprintf( Mil_Nt, "%s", DevType );    sprintf( Mil_Usn, "%s::%s", Udn, DevType );    CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn,                         Location, Duration, &szReq[2] );    // check error    if( ( RootDev && szReq[0] == NULL ) ||        szReq[1] == NULL || szReq[2] == NULL ) {        free( szReq[0] );        free( szReq[1] );        free( szReq[2] );        return UPNP_E_OUTOF_MEMORY;    }    // send replies    if( RootDev ) {        RetVal = NewRequestHandler( DestAddr, 3, szReq );    } else {        RetVal = NewRequestHandler( DestAddr, 2, &szReq[1] );    }    // free    free( szReq[0] );    free( szReq[1] );    free( szReq[2] );    return RetVal;}/************************************************************************* Function : ServiceAdvertisement									*																	* Parameters:	*	IN char * Udn: Device UDN*	IN char *ServType: Service Type.*	IN char * Location: Location of Device description document.*	IN int  Duration :Life time of this device.* Description:														*	This function creates the advertisement packet based *	on the input parameter, and send it to the multicast channel.** Returns: int*	UPNP_E_SUCCESS if successful else appropriate error***************************************************************************/intServiceAdvertisement( IN char *Udn,                      IN char *ServType,                      IN char *Location,                      IN int Duration ){    char Mil_Usn[LINE_SIZE];    char *szReq[1];    struct sockaddr_in DestAddr;    int RetVal;    DestAddr.sin_family = AF_INET;    DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP );    DestAddr.sin_port = htons( SSDP_PORT );    sprintf( Mil_Usn, "%s::%s", Udn, ServType );    //CreateServiceRequestPacket(1,szReq[0],Mil_Nt,Mil_Usn,    //Server,Location,Duration);    CreateServicePacket( MSGTYPE_ADVERTISEMENT, ServType, Mil_Usn,                         Location, Duration, &szReq[0] );    if( szReq[0] == NULL ) {        return UPNP_E_OUTOF_MEMORY;    }    RetVal = NewRequestHandler( &DestAddr, 1, szReq );    free( szReq[0] );    return RetVal;}/************************************************************************* Function : ServiceReply									*																	* Parameters:	*	IN struct sockaddr_in *DestAddr:*	IN char * Udn: Device UDN*	IN char *ServType: Service Type.*	IN char * Location: Location of Device description document.*	IN int  Duration :Life time of this device.* Description:														*	This function creates the advertisement packet based *	on the input parameter, and send it to the multicast channel.** Returns: int*	UPNP_E_SUCCESS if successful else appropriate error***************************************************************************/intServiceReply( IN struct sockaddr_in *DestAddr,              IN char *ServType,              IN char *Udn,              IN char *Location,              IN int Duration ){    char Mil_Usn[LINE_SIZE];    char *szReq[1];    int RetVal;    szReq[0] = NULL;    sprintf( Mil_Usn, "%s::%s", Udn, ServType );    CreateServicePacket( MSGTYPE_REPLY, ServType, Mil_Usn,                         Location, Duration, &szReq[0] );    if( szReq[0] == NULL ) {        return UPNP_E_OUTOF_MEMORY;    }    RetVal = NewRequestHandler( DestAddr, 1, szReq );    free( szReq[0] );    return RetVal;}/************************************************************************* Function : ServiceShutdown									*																	* Parameters:	*	IN char * Udn: Device UDN*	IN char *ServType: Service Type.*	IN char * Location: Location of Device description document.*	IN int  Duration :Service duration in sec.* Description:														*	This function creates a HTTP service shutdown request packet *	and sent it to the multicast channel through RequestHandler.** Returns: int*	UPNP_E_SUCCESS if successful else appropriate error***************************************************************************/intServiceShutdown( IN char *Udn,                 IN char *ServType,                 IN char *Location,                 IN int Duration ){    char Mil_Usn[LINE_SIZE];    char *szReq[1];    struct sockaddr_in DestAddr;    int RetVal;    DestAddr.sin_family = AF_INET;    DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP );    DestAddr.sin_port = htons( SSDP_PORT );    //sprintf(Mil_Nt,"%s",ServType);    sprintf( Mil_Usn, "%s::%s", Udn, ServType );    //CreateServiceRequestPacket(0,szReq[0],Mil_Nt,Mil_Usn,    //Server,Location,Duration);    CreateServicePacket( MSGTYPE_SHUTDOWN, ServType, Mil_Usn,                         Location, Duration, &szReq[0] );    if( szReq[0] == NULL ) {        return UPNP_E_OUTOF_MEMORY;    }    RetVal = NewRequestHandler( &DestAddr, 1, szReq );    free( szReq[0] );    return RetVal;}/************************************************************************* Function : DeviceShutdown									*																	* Parameters:	*	IN char *DevType: Device Type.*	IN int RootDev:1 means root device.*	IN char * Udn: Device UDN*	IN char * Location: Location URL*	IN int  Duration :Device duration in sec.** Description:														*	This function creates a HTTP device shutdown request packet *	and sent it to the multicast channel through RequestHandler.** Returns: int*	UPNP_E_SUCCESS if successful else appropriate error***************************************************************************/intDeviceShutdown( IN char *DevType,                IN int RootDev,                IN char *Udn,                IN char *_Server,                IN char *Location,                IN int Duration ){    struct sockaddr_in DestAddr;    char *msgs[3];    char Mil_Usn[LINE_SIZE];    int ret_code;    msgs[0] = NULL;    msgs[1] = NULL;    msgs[2] = NULL;    DestAddr.sin_family = AF_INET;    DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP );    DestAddr.sin_port = htons( SSDP_PORT );    // root device has one extra msg    if( RootDev ) {        sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn );        CreateServicePacket( MSGTYPE_SHUTDOWN, "upnp:rootdevice",                             Mil_Usn, Location, Duration, &msgs[0] );    }    DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,                         "In function DeviceShutdown\n" ); )        // both root and sub-devices need to send these two messages        CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn,                             Location, Duration, &msgs[1] );    sprintf( Mil_Usn, "%s::%s", Udn, DevType );    CreateServicePacket( MSGTYPE_SHUTDOWN, DevType, Mil_Usn,                         Location, Duration, &msgs[2] );    // check error    if( ( RootDev && msgs[0] == NULL ) ||        msgs[1] == NULL || msgs[2] == NULL ) {        free( msgs[0] );        free( msgs[1] );        free( msgs[2] );        return UPNP_E_OUTOF_MEMORY;    }    // send packets    if( RootDev ) {        // send 3 msg types        ret_code = NewRequestHandler( &DestAddr, 3, &msgs[0] );    } else                      // sub-device    {        // send 2 msg types        ret_code = NewRequestHandler( &DestAddr, 2, &msgs[1] );    }    // free msgs    free( msgs[0] );    free( msgs[1] );    free( msgs[2] );    return ret_code;}#endif // EXCLUDE_SSDP#endif // INCLUDE_DEVICE_APIS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -