您的位置:首页 > 理论基础 > 计算机网络

TCP服务器接收多个客户端连接

2009-08-25 12:04 295 查看
LRESULT CNetDogSDlg::OnXAcceptSocket(WPARAM wParam,LPARAM lParam)
{
int acc_sin_len; // Accept socket address length
SOCKADDR_IN acc_sin; // Accept socket address - internet style
SOCKET ConnectSocket;
SOCKET ListenSocket;
TEMPSOCKET ts;

UpdateComStatus();

ListenSocket = m_data.GetListenSocket();

if( WSAGETSELECTERROR( lParam ) != 0 ) {
ShowNetMonitorMsg( _T("在侦听 Socket 上发生错误.") );
// Cancel any further notifications.
//WSAAsyncSelect( ListenSocket,GetSafeHwnd(),0,0 );
//closesocket( ListenSocket );
//m_data.SetListenSocket( INVALID_SOCKET );
//m_data.SetListenSocketStatus( FALSE,m_txtPortStatus,m_btnListen );
return 0;
}

switch( WSAGETSELECTEVENT( lParam ) ) {
case FD_ACCEPT:
ShowNetMonitorMsg( _T("有客户申请连接...") );

// Accept the incoming connection.
acc_sin_len = sizeof( acc_sin );
ConnectSocket = accept( ListenSocket,( struct sockaddr FAR * )&acc_sin,( int FAR * )&acc_sin_len );
if( ConnectSocket == INVALID_SOCKET ) {
ShowNetMonitorMsg( _T("创建客户连接 Socket 失败.") );
return 0;
}

// Send main window a WSA_READ when either data is pending on
// the socket (FD_READ) or the connection is closed (FD_CLOSE)
if( WSAAsyncSelect( ConnectSocket,GetSafeHwnd(),UM_CONNECT,FD_READ | FD_WRITE | FD_CLOSE ) == SOCKET_ERROR ) {
ShowNetMonitorMsg( _T("建立客户连接 Socket 异步通信消息失败.") );
closesocket( ConnectSocket );
return 0;
}

// Get User information.
// --------------------------------------------------
{
CString str,strConnectPort,strHostIP,strHostName;
str.Format( _T("客户连接成功 - 连接到: Socket( %d ) "),ConnectSocket );
strConnectPort.Format( _T("%d"),acc_sin.sin_port );
strHostIP.Format( _T("%d.%d.%d.%d"),
acc_sin.sin_addr.S_un.S_un_b.s_b1,
acc_sin.sin_addr.S_un.S_un_b.s_b2,
acc_sin.sin_addr.S_un.S_un_b.s_b3,
acc_sin.sin_addr.S_un.S_un_b.s_b4
);
HOSTENT* pHostent = gethostbyaddr( (const char *)&(acc_sin.sin_addr),sizeof(struct in_addr),AF_INET );
if( !pHostent ) {
strHostName = _T("未知");
}
else {
strHostName = pHostent->h_name;
}
str += _T("端口号: ");
str += strConnectPort;
str += _T(" 客户IP: ");
str += strHostIP;
str += _T(" 客户机器名: ");
str += strHostName;
ShowNetMonitorMsg( str );

ts.Port = acc_sin.sin_port;
ts.skt = ConnectSocket;
lstrcpy( ts.UserName,strHostName );
lstrcpy( ts.IPAddress,strHostIP );
}
if( !m_data.AddTempSocket( &ts ) ) {
closesocket( ConnectSocket );
ShowNetMonitorMsg( _T("存贮客户连接 Socket 空间不足.") );
}
break;
case FD_CLOSE:
ShowNetMonitorMsg( _T("侦听 Socket 被关闭.") );
closesocket( ListenSocket );
m_data.SetListenSocket( INVALID_SOCKET );
m_data.SetListenSocketStatus( FALSE,m_txtPortStatus,m_btnListen );
break;
case FD_READ:
ShowNetMonitorMsg( _T("<接收数据>消息 到达侦听 Socket.") );
break;
case FD_WRITE:
ShowNetMonitorMsg( _T("<发送数据>消息 到达侦听 Socket.") );
break;
default:
ShowNetMonitorMsg( _T("<未知>消息 到达侦听 Socket.") );
break;
}

return 0;
}

LRESULT CNetDogSDlg::OnXConnectSocket(WPARAM wParam,LPARAM lParam)
{
SOCKET ConnectSocket;
CString str;
int nRet;
char Buf[MAX_SOCKET_BUF];

UpdateComStatus();

ConnectSocket = ( SOCKET )wParam;
if( WSAGETSELECTERROR( lParam ) != 0 ) {
str.Format(_T("在连接 Socket( %d ) 上发生错误,断开客户连接."),ConnectSocket );
ShowNetMonitorMsg( str );
closesocket( ConnectSocket );
m_data.DeleteConnectSocket( ConnectSocket );
m_data.UpdateProductInfo( m_lstProductInfo,FALSE );
m_data.ShowUserInfo( m_lstUserInfo );
return 0;
}

switch( WSAGETSELECTEVENT( lParam ) ) {
case FD_CLOSE:
str.Format( _T("连接在 Socket( %d )上的用户断开连接."),ConnectSocket );
ShowNetMonitorMsg( str );
closesocket( ConnectSocket );
m_data.DeleteConnectSocket( ConnectSocket );
m_data.UpdateProductInfo( m_lstProductInfo,FALSE );
m_data.ShowUserInfo( m_lstUserInfo );
break;
case FD_READ:
str.Format(_T("<接收数据>消息 到达连接 Socket( %d )."),ConnectSocket );
ShowNetMonitorMsg( str );
ZeroMemory( Buf,MAX_SOCKET_BUF );
nRet = recv( ConnectSocket,Buf,MAX_SOCKET_BUF,0 );
switch( nRet ) {
case SOCKET_ERROR:
str.Format( _T("从 连接 Socket( %d ) 读取数据时发生错误."),ConnectSocket );
ShowNetMonitorMsg( str );
break;
case 0:
str.Format( _T("连接 Socket( %d ) 被关闭."),ConnectSocket );
ShowNetMonitorMsg( str );
break;
default:
str.Format( _T("从连接 Socket( %d ) 读取了 %d 字节数据."),ConnectSocket,nRet );
if( !m_data.AddXData( ConnectSocket,Buf,nRet ) ) {
str += _T("/r/n---------> 数据缓冲区已满,数据被丢弃.");
}
else {
str += _T("/r/n---------> 数据成功保存到缓冲区,等待处理.");
}
ShowNetMonitorMsg( str );
m_data.ParseData( this,m_lstProductInfo,m_lstUserInfo );
break;
}
break;
case FD_WRITE:
str.Format(_T("<发送数据>消息 到达连接 Socket( %d )."),ConnectSocket );
ShowNetMonitorMsg( str );
break;
default:
str.Format(_T("<未知>消息 到达连接 Socket( %d )."),ConnectSocket );
ShowNetMonitorMsg( str );
break;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐