select模型实例

 
  
#include < WINSOCK2.H >
#include
< iostream >
#pragma comment(lib,"ws2_32")

int main()
{
using namespace std;
WSADATA wsaData;
WORD sockVersion
= MAKEWORD( 2 , 2 );
if (WSAStartup(sockVersion, & wsaData) != 0 )
{
cout
<< " 套接字库加载失败! " ;
exit(
0 );
}
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
cout
<< " 套接字库加载失败! " ;
exit(
0 );
}
USHORT nPort
= 4567 ;
SOCKET sListen
= socket(AF_INET,SOCK_STREAM, 0 );
sockaddr_in addrin;
addrin.sin_addr.S_un.S_addr
= INADDR_ANY;
addrin.sin_family
= AF_INET;
addrin.sin_port
= htons(nPort);

if (SOCKET_ERROR == bind(sListen,(sockaddr * ) & addrin, sizeof (sockaddr)))
{
cout
<< " 绑定失败!\n " ;
return - 1 ;
}
// 进入监听模式
if (SOCKET_ERROR == listen(sListen, 5 ))
{
cout
<< " 监听失败!\n " ;
return - 1 ;
}

// select模型处理过程
fd_set fdSocket;
FD_ZERO(
& fdSocket);
FD_SET(sListen,
& fdSocket);
while ( true )
{
// 将fdSocket集合的一个拷贝fdRead传递给Select函数
// 当有事件发生时,Select函数移除fdRead集合中没有未决I/O操作的套接字句柄,然后返回
fd_set fdRead = fdSocket;
int nRet = select( 0 , & fdRead,NULL,NULL,NULL); // 等待时间设为NULL,让它知道有时间发生时候才返回
if (nRet > 0 )
{
// 通过原来fdSocket集合与Select处理过的fdRead集合比较,确定有哪些套接字有未决I/O,并进一步处理
for ( int i = 0 ;i < ( int )fdSocket.fd_count;i ++ )
{
if (FD_ISSET(fdSocket.fd_array[i], & fdRead))
{
if (sListen == fdSocket.fd_array[i]) // 监听套接字接收到新连接
{
if (fdSocket.fd_count < FD_SETSIZE) // 小于fs_set结构的套接字最大数量
{
sockaddr_in addrRemote;
int nAddrlen = sizeof (addrRemote);
SOCKET NewSocket
= accept(sListen,(sockaddr * ) & addrRemote, & nAddrlen);
FD_SET(NewSocket,
& fdSocket);
cout
<< " 接收到 " << inet_ntoa(addrRemote.sin_addr) << " 的连接\n " ;
}
else
{
cout
<< " 连接数已经到达顶限\n " ;
continue ;
}
}
else
{
char szText[ 256 ];
int nRecv = recv(fdSocket.fd_array[i],szText, 256 , 0 );
if (nRecv > 0 ) // 数据可读
{
szText[nRecv]
= ' \0 ' ;
cout
<< " 接收到数据: " << szText << endl;
}
else // 连接关闭,重启或者中断
{
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i],
& fdSocket);
}
}
}
}
}
else
{
cout
<< " Select执行失败!\n " ;
break ;
}
}
return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值