项目实现中, 需要实现 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 ;
- }
来源: http://www.bubuko.com/infodetail-3098877.html