您的位置:首页 > 其它

一个select接收socket数据的例子

2008-03-27 21:16 218 查看
用select可以减少资源的占用,并发的处理客户端的socket连接请求。下面是一个具体的例子:


cout << "Starting Server...!" << endl;


fd_set fdSocket; // 所有可用套节字集合


FD_ZERO(&fdSocket);


FD_SET(m_sockfd, &fdSocket);


while(TRUE)




...{


// 2)将fdSocket集合的一个拷贝fdRead传递给select函数,


// 当有事件发生时,select函数移除fdRead集合中没有未决I/O操作的套节字句柄,然后返回。


fd_set fdRead = fdSocket;


if (::select(0, &fdRead, NULL, NULL, NULL) <= 0)




...{


cout << " Failed select()" << endl;


break;


}


// 3)通过将原来fdSocket集合与select处理过的fdRead集合比较,


// 确定都有哪些套节字有未决I/O,并进一步处理这些I/O。


for(int i=0; i<(int)fdSocket.fd_count; i++)




...{


if(!FD_ISSET(fdSocket.fd_array[i], &fdRead))


continue;


if(fdSocket.fd_array[i] == m_sockfd) // (1)监听套节字接收到新连接




...{


if(fdSocket.fd_count < FD_SETSIZE)




...{


sockaddr_in addrRemote;


int nAddrLen = sizeof(addrRemote);


SOCKET sNew = ::accept(m_sockfd, (SOCKADDR*)&addrRemote, &nAddrLen);


FD_SET(sNew, &fdSocket);


cout << "接收到连接(" << ::inet_ntoa(addrRemote.sin_addr) << ")" << endl;


}


else




...{


cout << " Too much connections!" << endl;


continue;


}


}


else




...{


memset(m_recvBuf, 0x00, sizeof(m_recvBuf)/sizeof(m_recvBuf[0]));


if(::recv(fdSocket.fd_array[i], (char *)m_recvBuf,


sizeof(m_recvBuf)/sizeof(m_recvBuf[0]), 0) > 0) // (2)可读


cout << "接收到数据:" << m_recvBuf << endl;


else // (3)连接关闭、重启或者中断




...{


::closesocket(fdSocket.fd_array[i]);


FD_CLR(fdSocket.fd_array[i], &fdSocket);


}


}


}


}

当然了,在前面别忘了要做好准备工作。具体可见socket例子的文章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: