int dis_link(link_t **headp) { clean_link(*headp); free(*headp); *headp = NULL; return 0; }
unsigned int __stdcall srv_thread(void * in) { int sock = (int)in; assert(sock > 0); int last_time = time(NULL); int now_time; struct timeval tv; fd_set fd_read; int err; setnonblocking(sock); /*设置套接字非阻塞*/ set_sock_buf(sock, 1024*64);/*设置套接字缓冲区大小*/ tv.tv_sec = 1; tv.tv_usec = 0; while(1){ FD_ZERO(&fd_read); FD_SET((unsigned int)sock, &fd_read); err = select(0, &fd_read, NULL, NULL, &tv); if(err == 0){ /*没数据,超时*/ now_time = time(NULL); if(now_time - last_time > (int)g_option.sp2smg_timeout){ /*链路超时*/ err = BUILD_ERROR(0, E_LINK_TIMEOUT); clean_link(sock, err); return err; } }else if(err > 0){ last_time = time(NULL); if(FD_ISSET(sock, &fd_read)){ err = rcv_msg2rsp(sock); if(err != 0){ clean_link(sock, err); return err; } }else{assert(0);} }else{assert(0);} /*不应该的流程*/ } return 0; }