2008年7月2日星期三

ai_sntp_srvInit

ST_RET ai_sntp_srvInit(ST_VOID)

{

    ST_INT32 wsocket;

    struct sockaddr_in localaddr;

    pid_t spawn_tid;

    ST_INT32 optval=1;

    ST_INT32 optvallen=sizeof(optval);

   

    /* 创建socket */

    if ( (wsocket=socket(AF_INET,SOCK_DGRAM,0)) == ERROR )

    {

       SXLOG_ERR1("server creat socket(%d) failed.",wsocket);

       return SD_FAILURE;

    }

 

    /* 本地ip参数初始化 */

    bzero((char*)&localaddr,sizeof(struct sockaddr_in));

    localaddr.sin_family = AF_INET;

    localaddr.sin_port = SNTP_PORT;

    localaddr.sin_addr.s_addr = htonl(INADDR_ANY);

 

    /* 将创建的socket绑定到ip */

    if ( bind(wsocket,(struct sockaddr*)(&localaddr),sizeof(struct sockaddr)) == ERROR )

    {

       SXLOG_ERR1("server Bind socket(%d) failed.",wsocket);

       return SD_FAILURE;

    }

 

    /* 设置为非阻塞方式 */

    if ( ioctl(wsocket,FIONBIO,(int)&optval) == ERROR )

    {

       printf("ioctl socket(%d) to LocalUdp failed.",wsocket);

       return SD_FAILURE;

    }

 

    if ( setsockopt(wsocket,SOL_SOCKET,SO_BROADCAST,(char*)&optval,optvallen) == ERROR )

    {

       SXLOG_ERR1("server setsockopt socket(%d) to LocalUdp failed.",wsocket);

        return SD_FAILURE;

    }

 

    /* 创建读任务 */

    spawn_tid = taskSpawn (

        "sntp_srv",      /* task name for debugging  */

        SNTP_PRIORITY_SERVER_TASK, /* priority - same as this task.   */

        0,        /* no task options supported    */

        20000,           /* stack size        */

        (FUNCPTR) ai_sntp_srvReadTask, /* task function entry point    */

        0, /* arg1    */

        0, /* arg2    */

        0, /* arg3    */

        0, 0, 0, 0, 0, 0, 0);      /* 7 more dummy args     */

 

    if (spawn_tid < 0)

    {

       SXLOG_ERR1 ("Error %d spawning 'sntp_srv' task", spawn_tid);

       return (SD_FAILURE);

    }

 

    g_sntp_lsocket = wsocket;

 

    return SD_SUCCESS;

}

0 评论: