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;
}
{
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;
}
相关文章推荐
- Socket与http、tcp客户端与服务器连接的区别!
- TCP客户端断开连接后,服务器连接处于CLOSE_WAIT状态之解决办法
- 客户端C和服务器S之间建立了一个TCP连接,TCP最大段长度为1KB,客户端C当前的拥塞窗口是16KB,向服务器S连续发送2个最大段之后,成功收到服务器S发送的第一段的确认段,确认段中通告的接受窗口大
- FL2440 通过Socket使开发板作为服务器支持多个客户端连接并与之通信,可通过命令获取当前温度。
- Qt TCP客户端无法连接服务器
- 一个简单的可以接收TCP客户端数据的TCP服务器
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- Socket与http、tcp客户端与服务器连接的区别!
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- Socket与http、tcp客户端与服务器连接的区别!
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- 一个简单的可以接收TCP服务器数据的TCP客户端
- 三次握手,Socket与http、tcp客户端与服务器连接的区别!
- (3) linux 3.x - client - TCP连接建立系列 — 客户端接收SYNACK和发送ACK
- TCP协议----客户端发送,服务器接收
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- Socket与http、tcp客户端与服务器连接的区别!
- Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)