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”,不知怎么回事,请高手们指点,谢谢!

解决方案 »

  1.   

    &protocol_Send是不是应该是protocol_Send。供你参考
      

  2.   

    to zwert(小张)&protocol_Send应该没有错误的,取地址啊
    struct DATA Data中的成员变量,都好像是定长的数据类型,CTime类我现在已注释了,不知怎么还不行,急死人啊
      

  3.   

    可是他已经是指针了。protocol_Send = (Protocol *)m_dataList.GetNext(position),已经是地址了。还有,m_dataList.GetNext(position)返回的是什么呢?建议但不调试一下,看看protocol_Send 是不是空,protocol_Send 指向的是不是有效的结构
      

  4.   

    同时,(&protocol_Send,sizeof(protocol_Send)中,sizeof(protocol_Send)的值应该是4,你去的是指针的长度,这很奇怪。按着你的程序,我理解send的是一个地址,不知道这是不是你的原意。
    请对照下面的程序
    Protocol protocol_Send;
    int nSended = conn.pSocket->Send(&protocol_Send,sizeof(protocol_Send));
    希望对你能有帮助。祝你好运。
      

  5.   

    可能conn.pSocket是一个无效的Socket,或者说没有进行必要的初始化,
    所以出现了访问异常。
      

  6.   

    不要在多线程的程序中用CSocket,如果必须要这样用,请查一下MSDN,对这个问题里面有讨论的。
      

  7.   

    protocol_Send里面有数据的,找个在单步调试时已看到了
      

  8.   

    另外,如果我把程序直接执行,当客户端连接上来,服务器端向客户端发送数据时,就出现以下错误Debug Assertion Failed
    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;
    }
      

  9.   

    错误可能就是conn.pSocket无效
    因为直接运行时出现一个指令引用的“Oxccccccccc”内存,不能“read”
    而该内存就是conn.pSocket的地址。问题应该解决了啦,谢谢大家,等会撒分
      

  10.   

    Send(&protocol_Send,sizeof(protocol_Send)???
    protocol_Send已经是要发送数据的地址了,还要再取它的地址吗?
    是不是这样就行了:
    Send(protocol_Send,sizeof(protocol_Send);
      

  11.   

    我现在是这样用的
    Send(protocol_send,sizeof(*protocol_send));
    且对conn.pSocket初始化了
    原来的问题也不再出现,但运行2分钟后,又出现一个新的问题File:sockcore.cpp
    Line:850
      

  12.   

    改成这样更好:
    Send(protocol_send, sizeof(Protocol));
    至于你说的新的错误,能说明白点吗?
      

  13.   

    我的分析,仅供参考。
    case 1:
    你的m_dataList数据链表有问题,可能运行一段时间后,有些节点上的地址指向的数据已经不存在了!发送前检查一下protocol_Send是否有数据?
    case 2:
    如Yokishiro(狂狼啸月)所说,你用的是mfc的吗?如果是,建议在线程里用api的socket!
      

  14.   

    我曾在网上看到过且用过,一些程序也是MFC中用的多线程,所以可能这方面问题也许不大另外,在服务器端的数据发送,我是采取10秒,定时发送一次的,数据队列的长度设置为500个,
      

  15.   

    做个测试,服务器不要发m_dataList上的数据了,换成发送一个固定长度的字符串看看还会不会出错!
      

  16.   

    Acess Violation
    一般有以下几个原因
    (1)试图对空指针进行操作
       这里的空指针指其地址0<=Addr<=0x00000000 0000FFFF
       一般是把句柄直接当做指针使用造成
    (2)试图操作不在本进程范围内的内存,
       一般是因为野指针
    (3)试图访问被锁定的空间
      

  17.   

    TO:junlinjd():您好!
    我按照你的建议,试验发现确实没有上述错误,真的可能是m_dataList上的数据有问题,你很棒!
    对于数据链表中的元素的操作,我是根据自定义协议,利用返回的信息来确定的,是不是与此有关啊?我是菜鸟,第一次编程,请多指点,谢谢大侠您啦!对了,我还要一个问题想请教一下:
    在服务器端的用户连接链表中的元素为多个时(即同时有多个客户机连上了服务器);当服务器端的接受函数,通过接受到的特殊信息(假如这个信息来自1#客户机),
    if(接受到的特殊信息)
    {
      Send(....);
    }
    这时发送的信息会不会只指向1#客户机呢?
      

  18.   

    if(接受到的特殊信息)
    {
      Send(....);
    }
    这时发送的信息会不会只指向1#客户机呢?发送给谁是由你来控制的,即发给哪个socket哪个就能收到。如果只想给发特殊消息的client的话,就在接受函数里记住对方的socket.
      

  19.   

    当然那你的意思,是最容易理解和接受的啊我的意思:是否可以,不需自己特意记住那个socket,
    因为我刚接受的特殊信息来自于这个socket,
    if(接受到的特殊信息,这个信息来自一个特定的socket)
    {
      Send(....);//它能否把信息发到上述的特定的socket的吗?
    }
      

  20.   

    学校里的网络速度这几天特别慢,所以上来特麻烦!我今天对File:sockcore.cpp
      Line:850这个错误,还是没有搞定,服务器端的发送线程中的m_dataList,不知哪个地方有问题。可能发送几十个包之后就出上述错误,另外客户端接受到的信息也都是乱码,客户端接受前,我初始化了,希望大家能再次指点!,谢谢!
      

  21.   

    当Protocol结构中含有CTime类的对象的成员变量,
    即struct Protocol{         //自定义协议结构
            DWORD Sqnum;       
    DWORD Checknum;    
            struct DATA Data;
    DWORD nCount;    //已发送次数
    char IpAddress[16];
             CTime ptime;
    };时
    上述的
    Send(protocol ,sizeof(protocol)),是不是有问题啊,sizeof()求得的大小,是不是不准确呀
    应该怎样?但我还想还是用结构来封装数据