大家好,我是新手,请大家帮忙解决一下;下面是类封装代码
//h文件
#pragma once
#include <Winsock2.h>
#pragma comment(lib, "WS2_32.LIB")class BaseSocket
{
public:
BaseSocket(void);
virtual ~BaseSocket(void);
private:
CRITICAL_SECTION m_crit;
SOCKET m_socket;
SOCKET m_accept;
WSAEVENT m_EventList[WSA_MAXIMUM_WAIT_EVENTS];
SOCKET m_SockArray[WSA_MAXIMUM_WAIT_EVENTS];
int m_Index;
WSANETWORKEVENTS m_NetworkEvent;
int m_ReturnIndex;
public:
BOOL InitSocket(long PortNum);
static unsigned int __stdcall SocketAcceptFunc(void * pParam);
static unsigned int __stdcall SocketRecvFunc(void * pParam);
void CloseSocket(void);
};
//CPP文件
//h文件
#pragma once
#include <Winsock2.h>
#pragma comment(lib, "WS2_32.LIB")class BaseSocket
{
public:
BaseSocket(void);
virtual ~BaseSocket(void);
private:
CRITICAL_SECTION m_crit;
SOCKET m_socket;
SOCKET m_accept;
WSAEVENT m_EventList[WSA_MAXIMUM_WAIT_EVENTS];
SOCKET m_SockArray[WSA_MAXIMUM_WAIT_EVENTS];
int m_Index;
WSANETWORKEVENTS m_NetworkEvent;
int m_ReturnIndex;
public:
BOOL InitSocket(long PortNum);
static unsigned int __stdcall SocketAcceptFunc(void * pParam);
static unsigned int __stdcall SocketRecvFunc(void * pParam);
void CloseSocket(void);
};
//CPP文件
解决方案 »
- 编译错误:致命错误 RC1121: RC : fatal error RC1121 : I/O error reading file,请问如何解决?
- 这是获胜机器的MAC地址来改IP地址的代码,能帮忙解决下吗?要详细
- 编译失败,不知道是什么原因,少联接了什么库文件
- 定义了全局变量,但是链接时一直出错,求助阿~~`
- 请教高手,怎样得到执行程序中dll的路径,不是加载dll的程序的路径?
- 怎么样保存我访问过文件的路径,以便下次再访问!mfc的
- 在线等,怎样得到一个控件相对于窗体的坐标
- 我想自定坐标映射方向,以CView左上角为坐标原点,坐标向右向下依次增大,一个逻辑单位代表0.1毫米,用SetMapMode(MM_ANISOTROPIC)加这两
- 项目在VS2008中编译出错,错误信息是:无法打开文件“.\objchk\i386\genprintIorw.sbr
- MFC 怎么连接 ACESS 数据库?
- 子类继承基类的指针后为何值不对
- 截屏工具思路求指导
#include "BaseSocket.h"BaseSocket::BaseSocket(void)
{
InitializeCriticalSection(&m_crit);
m_Index=0;}
BaseSocket::~BaseSocket(void)
{
this->CloseSocket();
EnterCriticalSection(&m_crit);
LeaveCriticalSection(&m_crit); // 删除临界区变量
DeleteCriticalSection(&m_crit);}
BOOL BaseSocket::InitSocket(long PortNum)
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
AfxMessageBox(_T("Load Lib Failed!"));
return FALSE;
} m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if(INVALID_SOCKET==m_socket)
{
AfxMessageBox(_T("Create Socket Failed!"));
return FALSE ;
}
u_long u1=1;
ioctlsocket(m_socket,FIONBIO,(u_long*)&u1); sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port= htons(PortNum);
addr.sin_addr.s_addr= htonl(INADDR_ANY); int nResult=bind(m_socket,(sockaddr*)&addr,sizeof(sockaddr));
if(SOCKET_ERROR==nResult)
{
AfxMessageBox(_T("Bind Failed!"));
return FALSE;
}
nResult=listen(m_socket,5);
if(SOCKET_ERROR==nResult)
{
AfxMessageBox(_T("Listen Failed!"));
return FALSE;
} // m_EventList=WSACreateEvent();
WSAEVENT NewEvent=WSACreateEvent();
if (NewEvent==WSA_INVALID_EVENT)
{
AfxMessageBox(_T("Create Event Failed!"));
return FALSE;
}
int WESerror=WSAEventSelect(m_socket,NewEvent,FD_ACCEPT|FD_CLOSE);
if (WESerror==INVALID_SOCKET)
{
AfxMessageBox(_T("Register Failed!"));
return FALSE;
}
//WSAEVENT eventArray[WSA_MAXIMUM_WAIT_EVENTS];
//SOCKET sockArray[WSA_MAXIMUM_WAIT_EVENTS];
m_Index=0;//int n=0;
m_EventList[m_Index]=NewEvent;//eventArray[n]=NewEvent;
m_SockArray[m_Index]=m_socket;//sockArray[n]=m_socket;
m_Index++;//n++; while(1)
{
m_ReturnIndex=WSAWaitForMultipleEvents(m_Index,m_EventList,FALSE,40000,FALSE);
if ((m_ReturnIndex==WSA_WAIT_FAILED)|(m_ReturnIndex==WSA_WAIT_TIMEOUT))
{
AfxMessageBox(_T("Failed!"));
break;
}
else
{
// WSANETWORKEVENTS m_NetworkEvent; WSAEnumNetworkEvents(m_SockArray[m_ReturnIndex-WSA_WAIT_EVENT_0],NULL,&m_NetworkEvent);
WSAResetEvent(m_EventList[m_ReturnIndex-WSA_WAIT_EVENT_0]); switch(m_NetworkEvent.lNetworkEvents)
{
case FD_ACCEPT:
{
HANDLE m_hThdAcc;
unsigned int m_ThdIDAcc; m_hThdAcc= ( HANDLE )_beginthreadex( NULL , NULL , SocketAcceptFunc , this ,
CREATE_SUSPENDED , &m_ThdIDAcc ); if( m_hThdAcc == NULL )
{
return FALSE;
}
ResumeThread(m_hThdAcc);
CloseHandle(m_hThdAcc); }
break;
case FD_READ:
{
HANDLE m_hThdRead;
unsigned int m_ThdIDRead; m_hThdRead= ( HANDLE )_beginthreadex( NULL , NULL , SocketRecvFunc , this ,
CREATE_SUSPENDED , &m_ThdIDRead ); if( m_hThdRead == NULL )
{
return FALSE;
}
ResumeThread(m_hThdRead);
CloseHandle(m_hThdRead);
}
break;
case FD_CLOSE: {
if (m_NetworkEvent.iErrorCode[FD_CLOSE_BIT]==0)
{
closesocket(m_SockArray[m_Index-WSA_WAIT_EVENT_0]);
WSACloseEvent(m_EventList[m_Index-WSA_WAIT_EVENT_0]);
//printf("套接字为【%d】的已关闭连接\n",sockArray[nIndex-WSA_WAIT_EVENT_0]);
AfxMessageBox(_T("1"));
}
else
{
if (m_NetworkEvent.iErrorCode[FD_CLOSE_BIT]==10053)
{
closesocket(m_SockArray[m_Index-WSA_WAIT_EVENT_0]);
WSACloseEvent(m_EventList[m_Index-WSA_WAIT_EVENT_0]);
//printf("客户端【%d】非法关闭连接\n",sockArray[nIndex-WSA_WAIT_EVENT_0]);
AfxMessageBox(_T("2"));
}
}
for (int j=m_Index-WSA_WAIT_EVENT_0;j<m_Index-1;j++)
{
m_SockArray[j]=m_SockArray[j+1];
m_EventList[j]=m_EventList[j+1];
}
m_Index--; }
default:
break; }
} }
closesocket(m_socket);
WSACleanup(); return TRUE;
}unsigned int __stdcall BaseSocket::SocketAcceptFunc(void * pParam)
{
BaseSocket *pParent = (BaseSocket *)pParam; if ((pParent->m_NetworkEvent).iErrorCode[FD_ACCEPT_BIT]==0)
{
if (pParent->m_Index>WSA_MAXIMUM_WAIT_EVENTS)
{
AfxMessageBox(_T("Too Many Connections!"));
}
pParent->m_accept=accept(pParent->m_SockArray[(pParent->m_ReturnIndex)-WSA_WAIT_EVENT_0],NULL,NULL); WSAEVENT sNewEvent=WSACreateEvent();
WSAEventSelect(pParent->m_accept,sNewEvent,FD_READ|FD_CLOSE);
pParent->m_EventList[pParent->m_Index]=sNewEvent;
pParent->m_SockArray[pParent->m_Index]=pParent->m_accept;
(pParent->m_Index)++;
}
_endthreadex(0);
return 0;}unsigned int __stdcall BaseSocket::SocketRecvFunc(void * pParam)
{
BaseSocket *pParent = (BaseSocket *)pParam;
if ((pParent->m_NetworkEvent).iErrorCode[FD_READ_BIT]==0)
{
char buf[256];
memset(buf,0,256);
int nRecv=recv(pParent->m_SockArray[(pParent->m_ReturnIndex)-WSA_WAIT_EVENT_0],buf,sizeof(buf),0);
if (nRecv>0)
{
CString tmp;
tmp.Format(_T("%s"),buf);
AfxMessageBox(tmp);
}
}
_endthreadex(0);
return 0;
}void BaseSocket::CloseSocket(void)
{
if ( m_socket != INVALID_SOCKET)
{
closesocket(m_socket);
} if ( m_accept != INVALID_SOCKET )
{
closesocket(m_accept);
} for (int i=0;i<WSA_MAXIMUM_WAIT_EVENTS;i++)
{ closesocket(m_SockArray[i]);
}
}