zoukankan      html  css  js  c++  java
  • DMS的实现转载

    #include "Neptune.h" 
    #include "Platinum.h" 
    #include <sys/ioctl.h> 
    #include <sys/select.h> 
    #include <sys/time.h> 
    #include <sys/socket.h> 
    #include <netinet/in.h> /* definations of sa_family structre,htons,INADDR_ANY,... */ 

    #include <arpa/inet.h> /* name ip format */ 

    #include <sys/types.h> /*give the defination of pid_t*/ 
    #include <sys/stat.h> 
    #include <fcntl.h> 
    #include <unistd.h> 
    #include <errno.h> 

    #include <stdlib.h> 


    #include <ctype.h> /* isspace() */ 

    #define BUFFER_MAX 1024 /* input buffer for commands */ 
    #define TOKEN_MAX 8 /* max number of arguments in buffer */ 
    #define REPLY_MAX 256 /* largest reply allowed */ 
    #define MAX_QUE_CONN_NM 10 

    NPT_SET_LOCAL_LOGGER("platinum.media.server.file") 

    //example:NPT_Debug("ERROR: failed to load entity (%d)\n", result); 

    int sockfd; 
    static NPT_Flags deviceStartFlag = 0; //服务启动状态为1,服务停止则状态为0 
    PLT_UPnP upnp; 
    PLT_DeviceHostReference device; 

    int init_sock() 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd == -1) 

    NPT_LOG_INFO("baojinyu---------------create socket error! \n"); 
    exit(1); 

    NPT_LOG_INFO("baojinyu---------------create socket successfully .\n"); 

    return 0; 


    int init_device() 

    device = new PLT_FileMediaServer( 
    "/data/local/1.3gp",//"/data/local/if.mp3", 
    "Platinum UPnP Media Server", 
    false, 
    "SAMEDEVICEGUID", // NULL for random ID 
    (NPT_UInt16)1194); 
    NPT_List<NPT_IpAddress> list; 
    NPT_CHECK_SEVERE(PLT_UPnPMessageHelper::GetIPAddresses(list)); 
    NPT_String ip = list.GetFirstItem()->ToString(); 

    device->m_ModelDescription = "Platinum File Media Server"; 
    device->m_ModelURL = "http://www.plutinosoft.com/"; 
    device->m_ModelNumber = "1.0"; 
    device->m_ModelName = "Platinum File Media Server"; 
    device->m_Manufacturer = "Plutinosoft"; 
    device->m_ManufacturerURL = "http://www.plutinosoft.com/"; 

    upnp.AddDevice(device); 
    NPT_CHECK_SEVERE(upnp.Start());//Just for test. 

    return 0; 


    int init() 

    init_sock(); 
    init_device(); 
    return 0; 


    //the following are commands. 
    static int HandleCmd_dmsStartStop(char **arg, char reply[REPLY_MAX]) 

    if (!deviceStartFlag){ 
    //start service 
    NPT_LOG_INFO("baojinyu------------socket cmd Start。"); 
    NPT_CHECK_SEVERE(upnp.Start()); 
    NPT_LOG_INFO("baojinyu------------upnp Start success!"); 
    deviceStartFlag = 1; 

    else{ 
    //stop service 
    NPT_LOG_INFO("baojinyu------------socket cmd stop。"); 
    upnp.Stop(); 
    NPT_LOG_INFO("baojinyu------------upnp stop success!"); 
    deviceStartFlag = 0; 

    return deviceStartFlag; 



    struct cmdinfo { 
    const char *name; 
    unsigned numargs; 
    int (*func)(char **arg, char reply[REPLY_MAX]); 
    }; 

    struct cmdinfo cmds[] = { 
    //{ "isMouse", 1, isMouse }, 
    //{ "mousePrecision", 1, mousePrecision }, 
    { "dmsStartStop", 0, HandleCmd_dmsStartStop }, 
    //{ "mediaManage", 1, HandleCmd_mediaManage }, 
    //{ "serverConfig", 1, HandleCmd_serverConfig }, 

    }; 

    static int readx(int fd, void *_buf, int count) 

    char *buf =(char *) _buf; 
    int n = 0, r; 
    if (count < 0) return -1; 
    while (n < count) { 
    r = read(fd, buf + n, count - n); 
    if (r < 0) { 
    if (errno == EINTR) continue; 
    NPT_LOG_INFO("read error\n"); 
    return -1; 

    if (r == 0) { 
    NPT_LOG_INFO("eof"); 
    return -1; /* EOF */ 

    n += r; 

    return 0; 


    static int writex(int fd, const void *_buf, int count) 

    const char *buf =(char *) _buf; 
    int n = 0, r; 
    if (count < 0) return -1; 
    while (n < count) { 
    r = write(fd, buf + n, count - n); 
    if (r < 0) { 
    if (errno == EINTR) continue; 
    NPT_LOG_INFO("write error"); 
    return -1; 

    n += r; 

    return 0; 



    /* Tokenize the command buffer, locate a matching command, 
    * ensure that the required number of arguments are provided, 
    * call the function(), return the result. 
    */ 
    static int execute(int s, char cmd[BUFFER_MAX]) 

    char reply[REPLY_MAX]; 
    char *arg[TOKEN_MAX+1]; 
    unsigned i; 
    unsigned n = 0; 
    unsigned short count, le_count; 
    int ret = -1; 

    /* default reply is "" */ 
    reply[0] = 0; 

    /* n is number of args (not counting arg[0]) */ 
    arg[0] = cmd; 
    while (*cmd) { 
    if (isspace(*cmd)) { 
    *cmd++ = 0; 
    n++; 
    arg[n] = cmd; 
    if (n == TOKEN_MAX) { 
    NPT_LOG_INFO("too many arguments"); 
    goto done; 


    cmd++; 


    for (i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) { 
    if (!strcmp(cmds[i].name,arg[0])) { 
    if (n != cmds[i].numargs) { 
    NPT_LOG_INFO("numargs doesnot equal requires arguments "); 
    } else { 
    ret = cmds[i].func(arg + 1, reply); 

    goto done; 


    NPT_LOG_INFO("unsupported command"); 

    done: 
    if (reply[0]) { 
    n = snprintf(cmd, BUFFER_MAX, "%d %s", ret, reply); 
    } else { 
    n = snprintf(cmd, BUFFER_MAX, "%d", ret); 

    if (n > BUFFER_MAX) n = BUFFER_MAX; 
    count = n; 

    /* receiver expects count in little-endian order */ 
    le_count = htole16(count); 

    // LOGI("reply: '%s'\n", cmd); 
    if (writex(s, &le_count, sizeof(le_count))) return -1; 
    if (writex(s, cmd, count)) return -1; 
    return 0; 


    int 
    main(int argc, char** argv) 

    //setup Neptune logging 
    NPT_LogManager::GetDefault().Configure("plist:.level=INFO;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=42");
    NPT_LOG_INFO("baojinyu---------------media server just begin\n "); 
    init(); 
    char buf[BUFFER_MAX]; 

    struct sockaddr_in server_sockaddr, client_sockaddr; 
    int sin_size = sizeof(struct sockaddr_in); 

    /* socket配置 */ 
    bzero(&server_sockaddr, sizeof(server_sockaddr)); 
    server_sockaddr.sin_family = AF_INET; /* 地址族 */ 
    server_sockaddr.sin_port = htons(7933);/* 端口号 */ 
    //server_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");/* 系统会自动填入本机的IP地址 */ 
    server_sockaddr.sin_addr.s_addr = INADDR_ANY; 
    //bzero(&(server_sockaddr.sin_zero),8);/*填充0和struct sockaddr 同样大小*/ 

    int i = 1; /* 允许重复使用本地地址与套接字进行绑定 */ 
    setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR, (const char*)&i, sizeof(i)); 

    //if(bind(sockfd,(struct sockaddr*)&server_sockaddr,len) < 0){ 
    if(bind(sockfd,(struct sockaddr*)&server_sockaddr, sin_size) == -1){ 
    NPT_LOG_INFO("baojinyu---------------Bind failure.\n "); 
    exit(1); 

    NPT_LOG_INFO("baojinyu--------------- Bind successfully.\n "); 

    /* listen for connections on a socket */ 
    if(listen(sockfd, MAX_QUE_CONN_NM) == -1){ 
    NPT_LOG_INFO("baojinyu--------------- Listen failure.\n "); 
    exit(1); 

    NPT_LOG_INFO("baojinyu--------------- Listen successfully "); 

    int client_fd, fd; 
    int result; 
    int readflag; 

    int maxfd=sockfd; 
    fd_set tmp_readfds; 
    fd_set readfds; 
    FD_ZERO(&readfds); 
    FD_SET(sockfd, &readfds); 

    fd_set tmp_writefds; 
    fd_set writefds; 
    FD_ZERO(&writefds); 
    FD_SET(sockfd, &writefds); 

    struct timeval timeout; 
    fd_set fdset; 

    while(true) 

    tmp_readfds = readfds; 
    tmp_writefds = writefds; 
    NPT_LOG_INFO("baojinyu--------------- enter while loop "); 
    timeout={5,0}; 
    result = select(maxfd+1, &tmp_readfds, &tmp_writefds, NULL, &timeout); 
    if(result == 0) 

    NPT_LOG_INFO("baojinyu----------------------Select timeout!---no change happens.\n"); 
    continue; 
    }else if(result == -1) 

    NPT_LOG_INFO("baojinyu----------------------Select failure!\n"); 
    break; 

    NPT_LOG_INFO("baojinyu-----------------Select successfully\n"); 

    for(fd=0; fd < FD_SETSIZE; fd++) 

    if(FD_ISSET(fd,&tmp_readfds)) 

    NPT_LOG_INFO("baojinyu-----------------FD_ISSET\n"); 
    if(fd == sockfd) 
    { //服务端接收客户端连接请求 
    NPT_LOG_INFO("baojinyu-----------------fd == sockfd\n"); 
    client_fd = accept(sockfd, (struct sockaddr*)&client_sockaddr, &sin_size); 
    sleep(1); 
    if(client_fd > 0) 

    if(client_fd > maxfd){ 
    maxfd = client_fd; 

    FD_SET(client_fd,&readfds); 
    /* 
    NPT_Debug("baojinyu--accept success--------Got connection from %s, port %d,socket %d\n", 
    inet_ntoa(client_sockaddr.sin_addr),ntohs(client_sockaddr.sin_port),client_fd); 
    * */ 
    printf("baojinyu--accept success--------Got connection from %s, port %d,socket %d\n", 
    inet_ntoa(client_sockaddr.sin_addr), ntohs(client_sockaddr.sin_port), client_fd); 

    }else { 
    NPT_LOG_INFO("baojinyu-----------------accept failure.\n"); 
    break; 


    }else{ 
    ioctl(fd,FIONREAD,&readflag); 
    if(readflag == 0){ 
    NPT_LOG_INFO("baojinyu----------------readflag == 0 \n"); 
    close(fd); 
    FD_CLR(fd,&readfds); 

    else{ 
    bzero(buf, BUFFER_MAX); 
    //处理客户端发来的消息-read size 
    unsigned short count; 
    if (readx(fd, &count, sizeof(count))){ 
    NPT_LOG_INFO("baojinyu-------------------failed to read size\n"); 
    break; 


    count = letoh16(count); 
    if ((count < 1) || (count >= BUFFER_MAX)) { 
    //NPT_LOG_INFO("baojinyu-------------------count error!\n"); 
    printf("baojinyu--------count error!--count= %d\n",count); 
    break; 

    if (readx(fd, buf, count)) { 
    NPT_LOG_INFO("baojinyu----------------failed to read command\n"); 
    break; 


    buf[count] = 0; 
    if (execute(fd, buf)) break; 



    } //end of if(FD_ISSET(fd,&tmp_readfds)) 
    } //end for 


    for(fd = 0; fd < FD_SETSIZE; fd++) 

    close(fd); 
    FD_CLR(fd,&readfds); 


    return 0; 

  • 相关阅读:
    C# Dev PropertyGrid
    C# PropertyGrid控件应用心得
    FileWriter不覆盖
    FileWriter
    java试题
    Java线程池
    java自带线程池和队列详细讲解
    HashMap练习题
    Map集合
    java指定
  • 原文地址:https://www.cnblogs.com/weinyzhou/p/4983360.html
Copyright © 2011-2022 走看看