65,211
社区成员
发帖
与我相关
我的任务
分享
// now begin the main loop.
while( !done ) //查看__{Quit}__处
{
// clear the set
FD_ZERO( &rset );
// add the listening socket
FD_SET( lsock, &rset );
// add all of the data sockets
for( itr = socketlist.begin(); itr != socketlist.end(); itr++ )
{
FD_SET( *itr, &rset );
}
// find out if there is any activity on any of the sockets.
i = select( 128, &rset, NULL, NULL, &zerotime ); //用MSDN查看select的说明,此处一直等待,直到rset句柄集中有输入
//这个集包括连接处理套接字和所accept的套接字
//lsock如果有输入则说明有新的连接请求
if( i > 0 )
{
if( FD_ISSET( lsock, &rset ) ) //有新连接
{
// incomming connection
cout < < "Incomming connection..." < < endl;
int dsock = accept( lsock, //响应并建立新连接
(struct sockaddr*)&socketaddress,
&sa_size );
if( dsock == -1 )
{
cout < < "Socket accepting error!" < < endl;
return 0;
}
cout < < "Socket " < < dsock < < " accepted." < < endl;
// add the socket to the list
socketlist.push_back( dsock ); //保存
}
// loop through each socket and see if it has any activity
for( itr = socketlist.begin(); itr != socketlist.end(); itr++ )
{
if( FD_ISSET( *itr, &rset ) ) //遍历,看某个连接是否有新的输入数据
{
// incomming data
cout < < "receiving data from socket ";
cout < < *itr < < "..." < < endl;
err = recv( *itr, buffer, 128, 0 );
if( err == -1 )
{
cout < < "Socket receiving error!" < < endl;
return 0;
}
if( err == 0 )
{
cout < < "Socket " < < *itr < < " closed" < < endl;
shutdown( *itr, 2 );
CloseSocket( *itr );
socketlist.erase( itr );
itr--;
}
else
{
cout < < "Data: " < < buffer < < endl;
// if the message was "servquit", then quit the server.
if( strcmp( buffer, "servquit" ) == 0 ) //__{Quit}__---------退出客户端发来的servquit消息,则服务退出
done = true;
}
}
}
}
}