www.pudn.com > TestIPMSG.rar > RecvChatContent.cpp
// RecvChatContent.cpp: implementation of the CRecvChatContent class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "TestIPMSG.h" #include "RecvChatContent.h" #include "ChatWidnowDlg.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// extern vectorg_AcceptClient; //// CRecvChatContent::CRecvChatContent() { } CRecvChatContent::~CRecvChatContent() { } BOOL CRecvChatContent::InitChatServerSocket() { int istat = WSAStartup(MAKEWORD(2,2),&m_wsa); if ( istat != 0 ) { AfxMessageBox("加载winsock失败!"); return FALSE; } m_ChatServerSocket = socket(AF_INET,SOCK_DGRAM,0); if ( m_ChatServerSocket == INVALID_SOCKET ) { AfxMessageBox("创建socket失败!"); return FALSE; } GetHostIP(m_dwLocalIPAddr); m_ChatServerIpAddr.sin_addr.S_un.S_addr = m_dwLocalIPAddr; m_ChatServerIpAddr.sin_family = AF_INET; m_ChatServerIpAddr.sin_port = htons(NET_CHAT_WINDOW_PORT); int ibind = bind(m_ChatServerSocket,(struct sockaddr FAR *) &m_ChatServerIpAddr,sizeof(SOCKADDR_IN)); if ( ibind == SOCKET_ERROR ) { AfxMessageBox("邦定socket失败!"); return FALSE; } return TRUE; } void CRecvChatContent::GetHostIP(DWORD &dwLocalIP) { struct hostent *thisHost; struct in_addr in; char hostName[80]; if ( gethostname(hostName,sizeof(hostName)) == SOCKET_ERROR ) { AfxMessageBox("取得本地主机名失败!"); return ; } if ( hostName != NULL ) thisHost = gethostbyname(hostName); int i = 0; while ( thisHost->h_addr_list[i] ) { in.S_un.S_addr = *(unsigned long *)thisHost->h_addr_list[i]; i++; } dwLocalIP = in.S_un.S_addr; } void CRecvChatContent::RecvDataFromClient() { char curFirstContent[NET_TRANSMIT_BUFFER]; SOCKADDR_IN addrfrom; int iAddrLen = sizeof ( SOCKADDR_IN ); int iRecv = recvfrom(m_ChatServerSocket,curFirstContent,sizeof(curFirstContent),0,(struct sockaddr FAR *)&addrfrom,&iAddrLen); if ( iRecv == SOCKET_ERROR ) { TRACE("接收失败!"); return; } DWORD dwClientIP; char curClientIPAddr[20]; dwClientIP = addrfrom.sin_addr.S_un.S_addr; sprintf(curClientIPAddr,"%d.%d.%d.%d", dwClientIP&0x000000ff, dwClientIP>>8&0x000000ff, dwClientIP>>16&0x000000ff, dwClientIP>>24&0x000000ff ); vector ::iterator ts; for( ts = g_AcceptClient.begin(); ts != g_AcceptClient.end(); ts ++ ) { if ( strcmp(ts->m_ClientIPAddr,curClientIPAddr) == 0 ) { CChatWidnowDlg chatWindowDlg; chatWindowDlg.GetChatContentFromClient(ts->m_loginName,curFirstContent); chatWindowDlg.DoModal(); break; } } if ( ts == g_AcceptClient.end() ) return ; } void CRecvChatContent::StartChatServerThread() { HANDLE hRecvChatThread = CreateThread(NULL,0,ChatServerSocketThread,this,CREATE_SUSPENDED,&m_dwThreadID); ResumeThread(hRecvChatThread); } DWORD CRecvChatContent::ChatServerSocketThread(LPVOID lParam) { CRecvChatContent *recvChat = ( CRecvChatContent *)lParam; BOOL bIni = recvChat->InitChatServerSocket(); if ( bIni == FALSE ) return 0L; FD_SET fdR; struct timeval timeouts; timeouts.tv_sec = 1; timeouts.tv_usec = 0; while( true ) { FD_ZERO(&fdR); FD_SET(recvChat->m_ChatServerSocket,&fdR); switch( select(recvChat->m_ChatServerSocket + 1,&fdR,NULL,NULL,&timeouts) ) { case -1: break; case 0: break; default: if ( FD_ISSET(recvChat->m_ChatServerSocket,&fdR) ) recvChat->RecvDataFromClient(); } Sleep(1); } return 0L; }