数据结构-链表-0
项目实现中,需要实现tcp服务,多链接处理数据,自定义传输协议,每个链接处理的数据完全不一样,每个链接处理完之后,链接可能继续存在,可能立刻就关闭了。 在设计中,使用了select模型进行处理链接,但是有些异常情况会导致一些异常信息存储在给定的数据集合中,数据存储是有上限的,作为服务,要一直运行,不能定时的对服务进行重启,数据存储集合的设计就存在了一定的问题。 当前解决办法: 1、买个链接处理完数据后,直接断开链接,释放资源。 2、每个链接标记存储到自定义队列中,设置超时时间,如果超过时间,就断开链接,释放资源。 当前采用了第一种方式在运行验证。 准备实现第二种方式,将两种方式进行比较
tcp服务数据接收代码部分,此部分采用select模式:
int recvTcp() { fd_set rfd ; timeval timeout ; int nRet ; timeout.tv_sec = 10 ; timeout.tv_usec = 0 ; FD_ZERO(&rfd) ; FD_SET(m_sockTcp,&rfd) ; while(TRUE){ fd_set fdread = rfd ; nRet = select(0,&fdread,NULL,NULL,&timeout) ; if(nRet>0){ for(UINT i=0 ; i<rfd.fd_count ;i++){ if(FD_ISSET(rfd.fd_array[i],&fdread)){ if(rfd.fd_array[i] == m_sockTcp){ if(rfd.fd_count<FD_SETSIZE){ sockaddr_in addrremote={0} ; int nlen = sizeof(addrremote) ; SOCKET sNew = accept(m_sockTcp,(sockaddr*)&addrremote,&nlen) ; FD_SET(sNew,&rfd) ; }else{ cout<<"max connection"<<endl ; continue ; } }else{ //接收数据 char buf[1024] ; recv(rfd.fd_array[i],buf,1024,0) ; } } } } } closesocket(m_sockTcp) ; return AR_OK ;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。