ClientSocket.h:
class CClientSocket : public CSocket
{
public:
CClientSocket();
virtual ~CClientSocket();
public:
void * m_pBuff;
protected:
virtual void OnReceive(int nErrorCode);
};ClientSocket.cpp:
CClientSocket::CClientSocket()
{
m_pBuff = (void *) new char(4096); //4k
}
void CClientSocket::OnReceive(int nErrorCode)
{
Receive(m_pBuff, 128);  //如果128改为64则正常。如果为128,后面的语句就会报错:0x77f9193c处未处理异   常:用户断点。也就是在单步执行完下面的语句后就进入系统代码,就报错
        CSocket::OnReceive(nErrorCode);
}
我分配的是4K的内存,为什么128个字节就报错??
开发环境:.net2003/vc++/mfc/mfc application/dialog

解决方案 »

  1.   

    我都是这样接受:
    char Enc_data[20000];
    while ( 0 != read(sockfd, Enc_data+datalen, 1)) 
    {
    datalen++;
    }我猜测可能一共不到128个
      

  2.   

    仅仅就这一部分代码来看,是没问题的,不知道你整个程序是怎样的
    把 Receive(m_pBuff,   128); 放到 CSocket::OnReceive(nErrorCode); 后看看,
    如果还出错就用WSAGetLastError()查看返回值,一目了然
      

  3.   


    Example:void CMyAsyncSocket::OnReceive(int nErrorCode)   // CMyAsyncSocket is 
                                                    // derived from CAsyncSocket
    {
       static int i=0;   i++;   TCHAR buff[4096];
       int nRead;
       nRead = Receive(buff, 4096); 
       
       switch (nRead)
       {
       case 0:
          Close();
          break;
       case SOCKET_ERROR:
          if (GetLastError() != WSAEWOULDBLOCK) 
          {
             AfxMessageBox ("Error occurred");
             Close();
          }
          break;
       default:
          buff[nRead] = 0; //terminate the string
          CString szTemp(buff);
          m_strRecv += szTemp;   // m_strRecv is a CString declared 
                               // in CMyAsyncSocket
          if (szTemp.CompareNoCase("bye") == 0 )    ShutDown();
       }
       CAsyncSocket::OnReceive(nErrorCode);
    }
    可以参考下这个。
      

  4.   

    TO:panther124
    用WSAGetLastError()好像不行呀? 是执行到系统代码dbgrpt.c(Debug CRT Reporting Functions)出错的
    这个问题有些怪呀,我的代码也很简单呀,基本上就是上面的代码
      

  5.   

    to:yuntianhai
    我参考了下你的做法,但还是这样
    nRead = Receive(buff, 4096); 
    但得到的nRead 却是1053,如果将4096改为>=1053的值,则nRead 都是1053,如果将4096改为<1053,则nRead 是实际值,不知道怎么回事情??
    是不是跟服务器端返回的数据有关系??
      

  6.   

    Receive第二个参数是要求读取的最大字节数,如果socket缓冲区中的字节数大于要读取的字节数,则按要求的读取,如果socket缓冲区中的字节数没有这么多,则有多少读取多少,实际读取的字节数返回到nRead。
      

  7.   

    iRece = Receive(m_pBuff, 64);
    不知道为什么,Receive第二个参数如果大于64,则执行完CSocket::OnReceive(nErrorCode); 后进入系统代码就会报错,而Receive第二个参数如果小于或等于64,则不会报错请问高手们这是怎么回事情呀?
      

  8.   

    明白了1053个字节是什么意思了!
    nRead = Receive(buff, 4096); 
    nRead为1053是因为服务器发给我了个结构体是1052个字节,再加上1个字节的数据,所以为1053
      

  9.   

    to:Jarrylogin我是在内网的一个网段上呀
      

  10.   

    iRece = Receive(m_pBuff, 64); 
    不知道为什么,Receive第二个参数如果大于64,则执行完CSocket::OnReceive(nErrorCode); 后进入系统代码就会报错:0x77f9193c处未处理异常:用户断点。而Receive第二个参数如果小于或等于64,则不会报错 请问高手们这是怎么回事情呀?
      

  11.   

    问题解决了,犯了个低级错误
    m_pBuff = (void *) new char(4096); //4k ,应该为:
    m_pBuff = (void *) new char[4096]; //4k 
    把括号写错了