⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serversocket.cpp

📁 几个关于网络模型的代码!有事件选择模型、重叠I/0模型
💻 CPP
字号:
#include "StdAfx.h"
#include ".\serversocket.h"

#define BUF_SIZE 8192

HWND CServerSocket::m_DlgWnd;

CWinThread* pServerListenThread = NULL;

// 监听线程
UINT _ServerListenThread(LPVOID lParam)
{
	TRACE("服务器端监听中.....\n");

	SOCKADDR_IN ClientAddr;                // 定义一个客户端得地址结构作为参数

	int addr_length=sizeof(ClientAddr);

	CServerSocket* psvSock = (CServerSocket*)lParam;

	::SendMessage(psvSock->m_DlgWnd,WM_MSG_NEWMSG,0,(LPARAM)(LPCSTR)"开始监听....");

	while(TRUE)
	{
		psvSock->m_sockComm = accept(psvSock->m_sockListen,(SOCKADDR*)&ClientAddr,&addr_length); 

                if(psvSock->m_sockComm == INVALID_SOCKET)
		{
			AfxMessageBox("Accept Connection failed");
			return 1;
		}

		CString strClientIP = inet_ntoa(ClientAddr.sin_addr);

		::SendMessage(psvSock->m_DlgWnd,WM_MSG_NEWMSG,0,(LPARAM)(LPCSTR)(strClientIP+"连接到本服务器"));

		while(TRUE)
		{
			char pRevMsg[BUF_SIZE]={0};

			int iLen=recv(psvSock->m_sockComm,pRevMsg,BUF_SIZE,0);     // 接收数据

			if(iLen>0)
			{
				if(strcmp((LPCSTR)pRevMsg,"[EXIT]")==0)
					return 0;

				::SendMessage(psvSock->m_DlgWnd,WM_MSG_NEWMSG,0,(LPARAM)(LPCSTR)pRevMsg);
			}
			else if(iLen==SOCKET_ERROR)
			{
				::SendMessage(psvSock->m_DlgWnd,WM_MSG_NEWMSG,0,(LPARAM)(LPCSTR)(strClientIP+"断开连接"));

			    break;
			}
		}
	}

	return 0;
}

CServerSocket::CServerSocket(void)
{
}

CServerSocket::~CServerSocket(void)
{
	if(pServerListenThread != NULL)
	{
        delete pServerListenThread;
		pServerListenThread = NULL;
	}

	WSACleanup();
}

CServerSocket::CServerSocket (UINT& port)
{

	m_nPort = port;

	WSADATA wsaData;

	int nRet;

	nRet=WSAStartup(MAKEWORD(2,2),&wsaData);                      //开启winsock.dll
	if(nRet!=0)
	{
		AfxMessageBox("Load winsock2 failed");
		WSACleanup();
		return ;
	}

	m_sockListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);         //创建服务套接字(流式)

	SOCKADDR_IN ServerAddr;                                       //分配端口及协议族并绑定

	ServerAddr.sin_family=AF_INET;                                //固定的
	ServerAddr.sin_addr.S_un.S_addr  =htonl(INADDR_ANY);          //用
	ServerAddr.sin_port=htons(port);

	nRet=bind(m_sockListen,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr)); // 绑定套接字

	if(nRet==SOCKET_ERROR)
	{
		AfxMessageBox("Bind Socket Fail!");
		closesocket(m_sockListen);
		return ;
	}

	nRet=listen(m_sockListen,1);                              //开始监听,并设置监听客户端数量
	if(nRet==SOCKET_ERROR)     
	{
		AfxMessageBox("Listening Fail!");
		return ;
	}
}

void CServerSocket::StartListening()
{
	pServerListenThread = ::AfxBeginThread(_ServerListenThread,this);              // 启动监听线程,并传递this指针
}

// 获得本机IP
CString CServerSocket::GetLocalIP()
{
	WSADATA wsaData;
	if(WSAStartup(MAKEWORD(2,2),&wsaData)==SOCKET_ERROR)
	{
		AfxMessageBox("取得主机名字失败!");
		return "未能获得";
	}

	int nLen=20;
	char hostname[20];
	gethostname(hostname,nLen);        // 获得本机主机名

	CString strHostName(hostname);

	struct hostent FAR* lpHostEnt = gethostbyname(strHostName);

	if(lpHostEnt == NULL)
	{
		return "0.0.0.0";
	}

	LPSTR lpAddr = lpHostEnt->h_addr_list[0];  // 取得IP地址列表中的第一个为返回的IP

	struct in_addr inAddr;

	memmove(&inAddr,lpAddr,4);

	return inet_ntoa(inAddr);         // 转化成标准的IP地址形式
}

void CServerSocket::SendMsg(CString& strMsg)
{
	int nRet = send(m_sockComm,strMsg,(int)strlen(strMsg),0);
	if(nRet==SOCKET_ERROR)
		AfxMessageBox("发送到客户机信息失败,请确认已建立连接!");
}

void CServerSocket::DisConnect()
{
	if(pServerListenThread != NULL)
	{
		DWORD   dwStatus;
		::GetExitCodeThread(pServerListenThread->m_hThread, &dwStatus);

		if (dwStatus == STILL_ACTIVE)
		{
			CString strExit = "[EXIT]";

			SOCKET tempSocket;  
			tempSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 

			SOCKADDR_IN ServerAddr;

			ServerAddr.sin_family=AF_INET;
			ServerAddr.sin_port=htons(m_nPort);
			ServerAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

			int nRet=connect(tempSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr)); 

			nRet=send(tempSocket,strExit,(int)strlen(strExit),0);
		}
		pServerListenThread = NULL;
	}	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -