一个select接收socket数据的例子

本文提供了一个使用select函数接收socket数据的例子。首先初始化fdSocket集合,然后在循环中调用select函数监听套接字。当有事件发生时,select会更新fdRead集合,接着检查并处理每个套接字的I/O操作。对于监听套接字,接收到新连接时增加到fdSocket集合;对于已连接套接字,如果可读则读取数据,否则关闭套接字并从集合中移除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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, 
0x00sizeof(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);
                }

            }

        }

    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值