www.pudn.com > MFCl.rar > Server.cpp


// Server.cpp: implementation of the CServer class. 
// 
////////////////////////////////////////////////////////////////////// 
 
 
#include "stdafx.h" 
#include "WSAAsyncSelectServer.h" 
#include "Server.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CServer::CServer() 
{ 
	//载入Winsock库 
	WSADATA wsaData; 
	WORD version = MAKEWORD(2, 2); 
	int ret = WSAStartup(version, &wsaData); 
	if(ret != 0) 
	{ 
		TRACE("载入Winsock库错误!\n");   
		AfxMessageBox("Failed in initial socket"); 
	} 
	 
	m_sListenSocket=NULL; 
} 
 
CServer::~CServer() 
{ 
	//将所有注册的异步事件取消 
	WSAAsyncSelect(m_sListenSocket, m_hWnd, 0, 0); 
	closesocket(m_sListenSocket); 
	WSACleanup(); 
} 
 
BOOL CServer::InitAndListen(HWND hwnd, UINT port) 
{ 
	m_uPort=port; 
	m_hWnd=hwnd; 
	 
	if(m_sListenSocket != NULL) 
    { 
        //如果已经创建了套接字先关闭原来的 
		closesocket(m_sListenSocket); 
		m_sListenSocket = NULL; 
	} 
	else if(m_sListenSocket == NULL) 
	{ 
		//创建新的套接字,这里是创建的流类型的套接字 
		m_sListenSocket = socket(AF_INET, SOCK_STREAM,0); 
		 
		/*If the result is 0, the macro prints a diagnostic message and aborts the program.  
		If the condition is nonzero, it does nothing. 
		In the Release version of MFC,  
		ASSERT does not evaluate the expression and thus will not interrupt the program.  
		If the expression must be evaluated regardless of environment,  
		use the VERIFY macro in place of ASSERT. 
		*/ 
		ASSERT(m_sListenSocket != NULL); 
	} 
	 
	m_addr.sin_family = AF_INET; 
	m_addr.sin_addr.S_un.S_addr = INADDR_ANY; 
	m_addr.sin_port = htons(m_uPort); 
	 
	int ret = 0; 
	//绑定一个套接字到本机的地址 
	ret = bind(m_sListenSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr)); 
	 
	if(ret == SOCKET_ERROR) 
	{	//绑定错误 
		AfxMessageBox("绑定错误!"); 
		return FALSE; 
	} 
 
	//将套接字设置为窗口消息类型 
	//向Windows注册一个或多个异步网络事件,并提供一个通知时使用的窗口句柄。 
	//但注册事件发生时,对应的窗口将收到一个基于消息的通知 
	if(SOCKET_ERROR==WSAAsyncSelect(m_sListenSocket, m_hWnd, SER_MESSAGE, FD_ACCEPT | FD_CLOSE)) 
		AfxMessageBox("无法将套接字设置为窗口消息类型"); 
 
 
	//开始一个监听过程,等待客户的连接 
	ret = listen(m_sListenSocket, 5);    //这里的第二个参数表示最多支持的客户连接数 
	if(ret == SOCKET_ERROR) 
	{	//listen失败 
		AfxMessageBox("监听错误!"); 
		return FALSE; 
	} 
	 
	return TRUE; 
}