Пример #1
0
int dis_link(link_t **headp)
{
	clean_link(*headp);
	free(*headp);
	*headp = NULL;
	
	return 0;
}
Пример #2
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;
}