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 vector g_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; 
}