按照http://support.microsoft.com/kb/140527/en-us的解决方法如下:
void CTransmitServerDlg::ProcessPendingAccept()
{
CServerToClientSocket* pSocket = new CServerToClientSocket();
if (m_pListenSocket.Accept(*pSocket))
{
CClientThread* pClientThread =(CClientThread*)AfxBeginThread(RUNTIME_CLASS(CClientThread),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
pClientThread->hConnected = pSocket->Detach(); //SOCKET hConnected;在CClientThread中定义
pClientThread->ResumeThread();
}
}
BOOL CClientThread::InitInstance()
{ pClientSocket->Attach(hConnected); }
但是还是有这个错误,不知道为什么?
同时在服务器退出,运行到pClientThread->pClientSocket->Close();在这里出现异常:
void PASCAL CAsyncSocket::KillSocket(SOCKET hSocket, CAsyncSocket* pSocket)
{
ASSERT(CAsyncSocket::LookupHandle(hSocket, FALSE) != NULL);
这两个问题这么了好久,请高手帮忙解答,如果分数不够解决后另外给分,多谢。
void CTransmitServerDlg::ProcessPendingAccept()
{
CServerToClientSocket* pSocket = new CServerToClientSocket();
if (m_pListenSocket.Accept(*pSocket))
{
CClientThread* pClientThread =(CClientThread*)AfxBeginThread(RUNTIME_CLASS(CClientThread),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
pClientThread->hConnected = pSocket->Detach(); //SOCKET hConnected;在CClientThread中定义
pClientThread->ResumeThread();
}
}
BOOL CClientThread::InitInstance()
{ pClientSocket->Attach(hConnected); }
但是还是有这个错误,不知道为什么?
同时在服务器退出,运行到pClientThread->pClientSocket->Close();在这里出现异常:
void PASCAL CAsyncSocket::KillSocket(SOCKET hSocket, CAsyncSocket* pSocket)
{
ASSERT(CAsyncSocket::LookupHandle(hSocket, FALSE) != NULL);
这两个问题这么了好久,请高手帮忙解答,如果分数不够解决后另外给分,多谢。
......
server.Accept((CSocket&)m_ClientSocket);
pClientThread->m_ThreadSocket=&m_ClientSocket;
pClientThread->m_ThreadSocket->Attach(m_ClientSocket.Detach(),FD_READ|FD_CLOSE);
.......
你是将pSocket = new CServerToClientSocket();中的pSocket地址赋给线程中的m_ThreadSocket么?m_ThreadSocket是线程中通讯的指针么?我那里的hConnected只是句柄帮定功能而已.
还有你这个Attach函数调用是在CTransmitServerDlg中,还是在CClientThread::InitInstance()中?现在没有环境,明天试试看行不行.
是的,C++中默认是没有办法把对象用等号付值的,除非你重载等号
2.m_ThreadSocket是线程中通讯的指针么?我那里的hConnected只是句柄帮定功能而已
是的,更准确的说是CSocket(或它的超类或子类)的指针
3.还有你这个Attach函数调用是在CTransmitServerDlg中,还是在CClientThread::InitInstance()中?
是在CTransmitServerDlg中设置的(我是这样做的,是不是能在CClientThread::InitInstance()中设置我还真不知道,没有试过,你可以试一下)
CServerToClientSocket *pSocket = new CServerToClientSocket;
if (m_pListenSocket.Accept(*pSocket))
{
CClientThread* pClientThread =(CClientThread*)AfxBeginThread(RUNTIME_CLASS(CClientThread),THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED);
pClientThread->m_pThreadSocket = pSocket;
pClientThread->m_pThreadSocket->Attach(pSocket->Detach());
DWORD aa = pClientThread->ResumeThread();
}
class CClientThread : public CWinThread
{
CServerToClientSocket *m_pThreadSocket;
}
if (m_pListenSocket.Accept((CServerToClientSocket*)&pSocket))
{
CClientThread* pClientThread =(CClientThread*)AfxBeginThread(RUNTIME_CLASS(CClientThread),THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED);
pClientThread->m_pThreadSocket = &pSocket;
pClientThread->m_pThreadSocket->Attach(pSocket->Detach());
DWORD aa = pClientThread->ResumeThread();
}
如上试试?我不经常上QQ,发到我邮箱[email protected]
server.Accept((SocketClient&)client);
pThread=(SocketThread*)::AfxBeginThread(RUNTIME_CLASS)(SocketThread) THREAD_PRIORITY_NORMAL, 0,
CREATE_SUSPENDED);
pThread->m_Socket=&client; //*********************************************
pThread->m_Socket->Attach(client.Detach(),FD_READ);
//********************************************** pThread->ResumeThread();顺利通过测试
int _cdecl EnterVideoStream(void* ptr, char* buff, int length)
{
aa = mClientInfoNode.pCleintThread->m_pThreadSocket->Send(bufftmp,ilen,0);
}
该回调函数也是一个线程,所以我在又一个线程中使用了m_pThreadSocket,出现了这个错误,现在是在第三个线程中使用套接字,请问有没有办法将句柄关联到这个回调函数中来呢?
头文件:
#include "MySocket.h"class CSocketArrayList
{
private:
DWORD m_index;//内部计数器
DWORD m_Limit;//对象数量限制计数器
CMySocketClient *m_Socket;//一个继承了CAnsynSocket的子类,在MySocket.h中定义
CObArray socketList;//Socket管理数组public:
/*********************************************/
/* 构造函数,初始化内部数组大小 */
/* 参数说明:len 要初始化的大小,默认是10 */
/*********************************************/
CSocketArrayList(DWORD len=10);
~CSocketArrayList();
/*********************************************/
/* 得到 Socket */
/*参数index :添加成功后返回的索引值 */
/*如果成功设置,返回CMySocketClient对象指针,否则返回NULL*/
/*********************************************/
CMySocketClient * getSocket(int *index);
/*********************************************/
/* 根据ID删除Socket */
/* 参数说明:hSocket Socket 句柄 */
/*如果成功设置,返回TRUE,否则返回FALSE */
/*********************************************/
BOOL deleteSocket(SOCKET hSocket);
/* 返回当前元素个数*/
DWORD getCount();
};
程序文件:
#include "stdafx.h"
#include "SocketArrayList.h"CSocketArrayList::CSocketArrayList(DWORD len)
{
//socketList.SetSize(len);
m_Limit=len;//设置对象数量限制
m_index=0;
}
CMySocketClient * CSocketArrayList::getSocket(int *index)
{
if(m_index>m_Limit)
return NULL; m_Socket=new CMySocketClient();
int index_socket=socketList.Add((CObject*)m_Socket);//将Socket添加到管理数组中
TRACE("getSocket函数:当前Socket数组中有%d个Socket连接!\n",socketList.GetSize());
*index=index_socket;//将索引通知调用函数
m_index++;//对象计数器加一
return m_Socket;
}
BOOL CSocketArrayList::deleteSocket(SOCKET m_hSocket)
{
int m_size=socketList.GetSize();
for(int i=0;i<m_size;i++)
{
CMySocketClient *pThisSocket=(CMySocketClient *)socketList.GetAt(i);
if((pThisSocket!=NULL)&&(pThisSocket->m_hSocket==m_hSocket))
{
pThisSocket->Close();//关闭这个Socket
socketList.RemoveAt(i);//从管理数组中删除这个对象
//delete pThisSocket;
TRACE("deleteSocket函数:当前Socket数组中还有%d个Socket连接!\n",socketList.GetSize());
m_index--;
return TRUE;
}
}
return FALSE;
}
DWORD CSocketArrayList::getCount()
{
return socketList.GetSize();
}
CSocketArrayList::~CSocketArrayList()
{
int m_size=socketList.GetSize();
for(int i=0;i<m_size;i++)
delete socketList.GetAt(i);
}
CMySocketClient *m_pClient;
m_pClient=new CMySocketClient();
m_pClient->Attach(m_hSocket,FD_READ|FD_CLOSE);
调试过,可以工作.