📄 serversocket.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 + -