📄 ssdp_device.c
字号:
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 + -