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 评论:
发表评论