UINT _SendMsgThread(LPVOID lparam) //TCP发送信息线程函数
{
s_cs.Lock();
POSITION position = m_dataList.GetHeadPosition();
int N = m_dataList.GetCount();
if(position)
{
for(int j = 0; j < m_dataList.GetCount(); j++)
{
Protocol * protocol_Send = (Protocol *)m_dataList.GetNext(position);
s_cs_client.Lock();
POSITION pos = m_connectionList.GetHeadPosition();
if(pos)
{
for(int i = 0; i < m_connectionList.GetCount(); i++)
{
CONN conn = m_connectionList.GetNext(pos);
int nSended = conn.pSocket->Send(&protocol_Send,sizeof(protocol_Send));
; }
}
s_cs_client.Unlock();
}
}
s_cs.Unlock();
return 0;
}
其中m_connectionList(用于客户);m_dataList为两个不同的链表(发放的数据),
struct Protocol{ //自定义协议结构
DWORD Sqnum;
DWORD Checknum;
struct DATA Data;
DWORD nCount; //已发送次数
char IpAddress[16];
};设置端点在int nSended = conn.pSocket->Send(),当运行到此处时,就出现
“Unhandled exception in Comm.exe oxC0000005:Acess Violation”,不知怎么回事,请高手们指点,谢谢!
{
s_cs.Lock();
POSITION position = m_dataList.GetHeadPosition();
int N = m_dataList.GetCount();
if(position)
{
for(int j = 0; j < m_dataList.GetCount(); j++)
{
Protocol * protocol_Send = (Protocol *)m_dataList.GetNext(position);
s_cs_client.Lock();
POSITION pos = m_connectionList.GetHeadPosition();
if(pos)
{
for(int i = 0; i < m_connectionList.GetCount(); i++)
{
CONN conn = m_connectionList.GetNext(pos);
int nSended = conn.pSocket->Send(&protocol_Send,sizeof(protocol_Send));
; }
}
s_cs_client.Unlock();
}
}
s_cs.Unlock();
return 0;
}
其中m_connectionList(用于客户);m_dataList为两个不同的链表(发放的数据),
struct Protocol{ //自定义协议结构
DWORD Sqnum;
DWORD Checknum;
struct DATA Data;
DWORD nCount; //已发送次数
char IpAddress[16];
};设置端点在int nSended = conn.pSocket->Send(),当运行到此处时,就出现
“Unhandled exception in Comm.exe oxC0000005:Acess Violation”,不知怎么回事,请高手们指点,谢谢!
struct DATA Data中的成员变量,都好像是定长的数据类型,CTime类我现在已注释了,不知怎么还不行,急死人啊
请对照下面的程序
Protocol protocol_Send;
int nSended = conn.pSocket->Send(&protocol_Send,sizeof(protocol_Send));
希望对你能有帮助。祝你好运。
所以出现了访问异常。
program ....\debug\Comm.exe
File:wincore.cpp
Line:980........
包含wincore.cpp的980行代码如下:
BOOL CWnd::DestroyWindow()
{
if (m_hWnd == NULL)
return FALSE; CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL);
CWnd* pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);
#ifdef _DEBUG
HWND hWndOrig = m_hWnd;
#endif#ifdef _AFX_NO_OCC_SUPPORT
BOOL bResult = ::DestroyWindow(m_hWnd);
#else //_AFX_NO_OCC_SUPPORT
BOOL bResult;
if (m_pCtrlSite == NULL)
bResult = ::DestroyWindow(m_hWnd);
else
bResult = m_pCtrlSite->DestroyControl();
#endif //_AFX_NO_OCC_SUPPORT // Note that 'this' may have been deleted at this point,
// (but only if pWnd != NULL)
if (pWnd != NULL)
{
// Should have been detached by OnNcDestroy
#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);// 这行为980行
#endif
}
else
{
#ifdef _DEBUG
ASSERT(m_hWnd == hWndOrig);
#endif
// Detach after DestroyWindow called just in case
Detach();
}
return bResult;
}
因为直接运行时出现一个指令引用的“Oxccccccccc”内存,不能“read”
而该内存就是conn.pSocket的地址。问题应该解决了啦,谢谢大家,等会撒分
protocol_Send已经是要发送数据的地址了,还要再取它的地址吗?
是不是这样就行了:
Send(protocol_Send,sizeof(protocol_Send);
Send(protocol_send,sizeof(*protocol_send));
且对conn.pSocket初始化了
原来的问题也不再出现,但运行2分钟后,又出现一个新的问题File:sockcore.cpp
Line:850
Send(protocol_send, sizeof(Protocol));
至于你说的新的错误,能说明白点吗?
case 1:
你的m_dataList数据链表有问题,可能运行一段时间后,有些节点上的地址指向的数据已经不存在了!发送前检查一下protocol_Send是否有数据?
case 2:
如Yokishiro(狂狼啸月)所说,你用的是mfc的吗?如果是,建议在线程里用api的socket!
一般有以下几个原因
(1)试图对空指针进行操作
这里的空指针指其地址0<=Addr<=0x00000000 0000FFFF
一般是把句柄直接当做指针使用造成
(2)试图操作不在本进程范围内的内存,
一般是因为野指针
(3)试图访问被锁定的空间
我按照你的建议,试验发现确实没有上述错误,真的可能是m_dataList上的数据有问题,你很棒!
对于数据链表中的元素的操作,我是根据自定义协议,利用返回的信息来确定的,是不是与此有关啊?我是菜鸟,第一次编程,请多指点,谢谢大侠您啦!对了,我还要一个问题想请教一下:
在服务器端的用户连接链表中的元素为多个时(即同时有多个客户机连上了服务器);当服务器端的接受函数,通过接受到的特殊信息(假如这个信息来自1#客户机),
if(接受到的特殊信息)
{
Send(....);
}
这时发送的信息会不会只指向1#客户机呢?
{
Send(....);
}
这时发送的信息会不会只指向1#客户机呢?发送给谁是由你来控制的,即发给哪个socket哪个就能收到。如果只想给发特殊消息的client的话,就在接受函数里记住对方的socket.
因为我刚接受的特殊信息来自于这个socket,
if(接受到的特殊信息,这个信息来自一个特定的socket)
{
Send(....);//它能否把信息发到上述的特定的socket的吗?
}
Line:850这个错误,还是没有搞定,服务器端的发送线程中的m_dataList,不知哪个地方有问题。可能发送几十个包之后就出上述错误,另外客户端接受到的信息也都是乱码,客户端接受前,我初始化了,希望大家能再次指点!,谢谢!
即struct Protocol{ //自定义协议结构
DWORD Sqnum;
DWORD Checknum;
struct DATA Data;
DWORD nCount; //已发送次数
char IpAddress[16];
CTime ptime;
};时
上述的
Send(protocol ,sizeof(protocol)),是不是有问题啊,sizeof()求得的大小,是不是不准确呀
应该怎样?但我还想还是用结构来封装数据