100分,在线等待,修改了从网上copy的一个socket 类,但是在析构的时候出现错误,请高手帮我看看都有那些方面的问题
写了一个服务器端,里面有一个TListenThread类,在这个类里使用线程,在类析构的时候发现10038错误。
//类定义
class TListenThread
{
private:
WSAData wsaData;
struct sockaddr_in server;
fd_set FDS;
UINT m_Port;
char szTmp[256];//Error Message
protected:
public:
TListenThread(UINT m_PortA,bool CreateSuspended);
virtual ~TListenThread();
SOCKET m_Socket;
HANDLE m_ListenThreadHandle;
friend unsigned __stdcall ThreadProc(void* lpParam);//线程函数
void DoError();
void InitSocket();
void CreateListenSocket();
void SetListenSocket();
void BindListenSocket();
void ListenSocket();
bool bstop;
};
//类实现:
TListenThread::TListenThread(UINT m_PortA,bool CreateSuspended)
{
m_Socket=INVALID_SOCKET;
m_Port=m_PortA;
szTmp[0]='\0';
::ZeroMemory(&wsaData,sizeof(WSAData));
::ZeroMemory(&server,sizeof(struct sockaddr_in));
bstop=false;
//创建线程
HANDLE m_ListenThreadHandle=(HANDLE)_beginthreadex(NULL,0,ThreadProc,(void*)this,0,NULL);
}
//---------------------------------------------------------------------------
unsigned __stdcall ThreadProc(void* lpParam)//线程函数
{
TListenThread * p = (TListenThread *) lpParam;
char buf[4096];
struct sockaddr_in from; //for UDP
int nLen=sizeof(from),nSize=0; //for UDP
p->InitSocket();
p->CreateListenSocket();
p->SetListenSocket();
p->BindListenSocket();
p->ListenSocket();
struct sockaddr_in client;
int nLength=sizeof(struct sockaddr_in);
while(!p->bstop)
{
int nError=select(1,&(p->FDS),0,0,0);
//if(nError<=0) Terminate();
SOCKET m_AcceptSocket=accept(p->m_Socket,(struct sockaddr*)&client,&nLength);
if(m_AcceptSocket==INVALID_SOCKET)
{
sprintf(p->szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
::MessageBox(0,p->szTmp,"Error",MB_OK+MB_ICONERROR);
p->DoError();
//Terminate();
return 0;
}
TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
int i=1;
}
_endthreadex(0);
}
//---------------------------------------------------------------------------
TListenThread::~TListenThread()
{
closesocket(m_Socket);
::WSACleanup(); //这里出现10038错误
m_Socket=INVALID_SOCKET;
m_Port=0;
szTmp[0]='\0';
::ZeroMemory(&wsaData,sizeof(WSAData));
::ZeroMemory(&server,sizeof(struct sockaddr_in));
}
//----------------------------------------------------------------------------
void TListenThread::DoError()
{
if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
WSACleanup();
return;
}
//----------------------------------------------------------------------------
void TListenThread::InitSocket()
{
WORD version=MAKEWORD(2,0);
if(::WSAStartup(version,&wsaData))
{
sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
}
//-------------------------------------------------------------------------------
void TListenThread::CreateListenSocket()
{
m_Socket=socket(AF_INET,SOCK_STREAM,0);
if(m_Socket==INVALID_SOCKET){
sprintf(szTmp,"Failed to create socket!");
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
}
//---------------------------------------------------------------------------
void TListenThread::SetListenSocket()
{
server.sin_family=AF_INET;
server.sin_port=htons(m_Port);
server.sin_addr.S_un.S_addr=INADDR_ANY;
int NewOpenType=SO_SYNCHRONOUS_NONALERT;
if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4))
{
sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
}
//-----------------------------------------------------------------------------
void TListenThread::BindListenSocket()
{
if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in)))
{
sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
}
//-----------------------------------------------------------------------------
void TListenThread::ListenSocket()
{
if(listen(m_Socket,SOMAXCONN))
{
sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
//Determine whether there is any connection
FD_ZERO(&FDS);
FD_SET(m_Socket,&FDS);
}
请大家帮忙看看,如何把这个类改的没有错误?