C实现SSDP协议的设备发现及设备搜索

本文介绍了在C语言中实现SSDP协议时遇到的问题及其解决方案,包括多线程资源抢占导致的UUID数据错乱和回调函数执行错乱。解决方案分别采用互斥锁和避免回调重名。同时,文章总结了使用select和FD_ISSET检查文件描述符就绪的知识点,并提供了完整的SSDP代码示例链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * ===========================================================================
 *
 *       Filename:  ssdpServer.c
 *    Description:  设备发现服务(自实现ssdp协议,获取USERNAME进行绑定)
 *        Version:  1.0
 *        Created:  08/29/2017 07:20:10 PM
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (syc),
 *        Company:  xxxx
 *
 * ===========================================================================
 */

#include <sys/types.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utils/queue.h"
#include "utils/log.h"
#include "Discovery/ssdpServer.h"

#define SSDP_MCAST_ADDR ("239.255.255.250")
#define SSDP_PORT (1900)
#define M1_PORT (8200)

#define OS_VERSION "3.4.72-rt89"
#define SERVER_NAME "MiniDLNA"
#define MINIDLNA_VERSION "1.1.0"
#define MINIDLNA_SERVER_STRING  OS_VERSION " DLNADOC/1.50 UPnP/1.0 " SERVER_NAME "/" MINIDLNA_VERSION
#define ROOTDESC_PATH "/rootDesc.xml"

#define MAC_ADDR_LEN (16)
#define IP_ADDR_LEN (16)
#define MAXSIZE (1024)

queue_t *handle_queue = NULL;
pthread_t handle_ThreadID;
pthread_t handle_ThreadID1;

typedef struct _packet_{
  char data[MAXSIZE];
  int len;
  int type;
}msg_packet_t;

eq_discovery_cb_t callback = {0};
//全局变量
struct sockaddr_in   addrin     ;  
struct timeval       rtime      ;  
int                ssdp_sock    ;  
int                peer_listen  ;  
int                peer_sock    ;  
socklen_t          addrlen      ;
fd_set               fds        ;
int                  maxfdp     ;

char              buf[1024]     ;

//这两个参数根据业务需要而定
char              UUID[32] = {0};//D的唯一标识(MAC地址)
char              M1_IP[32] = {0}; //D的eth0.2的IP地址



static const char * const known_service_types[] =
{
  "uuid:00000000-0000-0000-0000-000000000000",
  "upnp:rootdevice",
  "urn:schemas-upnp-org:device:MediaServer:",
  "urn:schemas-upnp-org:service:ContentDirectory:",
  "urn:schemas-upnp-org:service:ConnectionManager:",
  "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:",
  0
};
//获取IP地址
int get_lan_ip(unsigned char *ipaddr)
{
    struct sockaddr_in *addr;
    struct ifreq ifr;
    int sockfd;

    //char *name = "br-lan";
    char *name = "eth0.2";//eth0.2的IP地址
    if( strlen(name) >= IFNAMSIZ)
        return -1;

    strcpy( ifr.ifr_name, name);
    sockfd = socket(AF_INET,SOCK_DGRAM,0);

    //get ipaddr
    if(ioctl(sockfd, SIOCGIFADDR, &ifr) == -1)
    {
        close(sockfd);
        return -1;
    }

    addr = (struct sockaddr_in *)&(ifr.ifr_addr);


    //memcpy(ipaddr, &addr->sin_addr, IP_ADDR_LEN);
    strcpy(ipaddr, inet_ntoa(addr->sin_addr));
    //printf("get_lan_ip: %d.%d.%d.%d\n",ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
    printf("get_lan_ip: %s\n",ipaddr);

    close(so
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值