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

http://blog.csdn.net/dongfangyu/article/details/4482529

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;

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值