基于MFC对话框的EXE工程,服务端程序正确。客户端程序负责接收数据,单步调试不会死机,但运行时会死机,找不到问题出在哪了?

解决方案 »

  1.   

    死机?CPU100%?客户端线程没有Sleep?
      

  2.   

    没有程序,不知道问题在哪?这有一些socket例子,拿一个试试:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  3.   


    客户端没用多线程,用的是CAsyncSocket类,自己定义了一个CMySocket类继承CAsyncSocket类,重载了OnReceive函数,在OnReceive中接受数据,代码如下:void CMySocket::OnReceive(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call the base class
    double data=0;
    long Size;
    long FileLength;
    long WriteOnce;
    int count=0;
    int ErrorNum=0;
    int RcvBuf=0;
    int RcvBufSize=sizeof(int);
    int i=0;
    if(SOCKET_ERROR==receiveSockets.Receive(&FileLength,sizeof(long)))
    {
    ErrorNum=GetLastError();
    }
    Size=FileLength;
    while(Size>0)
    {

    //设置接受缓冲区大小
    if (getsockopt(receiveSockets,SOL_SOCKET,SO_RCVBUF,(char *)&RcvBuf,&RcvBufSize)!=SOCKET_ERROR)
    {
    if (RcvBuf<512)
    RcvBuf=512;
    setsockopt(receiveSockets,SOL_SOCKET,SO_RCVBUF,(char*)&RcvBuf,RcvBufSize);
    }
    //接收数据
    if(SOCKET_ERROR==(WriteOnce=receiveSockets.Receive(&data,sizeof(double))))
    {
    ErrorNum=GetLastError();
    }


    //存放信号样本点
    if (!EnQueue(myQue,data))
    {
    AfxMessageBox("add a data error\n");
    }
    Size=Size-WriteOnce;
    }
    count=QueueLength(myQue);
    AfxMessageBox("信号接受完成");
    CAsyncSocket::OnReceive(nErrorCode);
    }单步调试时程序能走到AfxMessageBox("信号接受完成");,但是正式运行是不会显示AfxMessageBox("信号接受完成");而且对话框界面按钮无法操作。请问前辈,是什么原因?
      

  4.   


    客户端没用多线程,用的是CAsyncSocket类,自己定义了一个CMySocket类继承CAsyncSocket类,重载了OnReceive函数,在OnReceive中接受数据,代码如下:void CMySocket::OnReceive(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call the base class
    double data=0;
    long Size;
    long FileLength;
    long WriteOnce;
    int count=0;
    int ErrorNum=0;
    int RcvBuf=0;
    int RcvBufSize=sizeof(int);
    int i=0;
    if(SOCKET_ERROR==receiveSockets.Receive(&FileLength,sizeof(long)))
    {
    ErrorNum=GetLastError();
    }
    Size=FileLength;
    while(Size>0)
    {//设置接受缓冲区大小
    if (getsockopt(receiveSockets,SOL_SOCKET,SO_RCVBUF,(char *)&RcvBuf,&RcvBufSize)!=SOCKET_ERROR)
    {
    if (RcvBuf<512)
    RcvBuf=512;
    setsockopt(receiveSockets,SOL_SOCKET,SO_RCVBUF,(char*)&RcvBuf,RcvBufSize);
    }
    //接收数据
    if(SOCKET_ERROR==(WriteOnce=receiveSockets.Receive(&data,sizeof(double))))
    {
    ErrorNum=GetLastError();
    }
    //存放信号样本点
    if (!EnQueue(myQue,data))
    {
    AfxMessageBox("add a data error\n");
    }
    Size=Size-WriteOnce;
    }
    count=QueueLength(myQue);
    AfxMessageBox("信号接受完成");
    CAsyncSocket::OnReceive(nErrorCode);
    }单步调试时程序能走到AfxMessageBox("信号接受完成");,但是正式运行是不会显示AfxMessageBox("信号接受完成");而且对话框界面按钮无法操作。
      

  5.   


    客户端没用多线程,用的是CAsyncSocket类,自己定义了一个CMySocket类继承CAsyncSocket类,重载了OnReceive函数,在OnReceive中接受数据,代码如下:void CMySocket::OnReceive(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call the base class
    double data=0;
    long Size;
    long FileLength;
    long WriteOnce;
    int count=0;
    int ErrorNum=0;
    int RcvBuf=0;
    int RcvBufSize=sizeof(int);
    int i=0;
    if(SOCKET_ERROR==receiveSockets.Receive(&FileLength,sizeof(long)))
    {
    ErrorNum=GetLastError();
    }
    Size=FileLength;
    while(Size>0)
    {//设置接受缓冲区大小
    if (getsockopt(receiveSockets,SOL_SOCKET,SO_RCVBUF,(char *)&RcvBuf,&RcvBufSize)!=SOCKET_ERROR)
    {
    if (RcvBuf<512)
    RcvBuf=512;
    setsockopt(receiveSockets,SOL_SOCKET,SO_RCVBUF,(char*)&RcvBuf,RcvBufSize);
    }
    //接收数据
    if(SOCKET_ERROR==(WriteOnce=receiveSockets.Receive(&data,sizeof(double))))
    {
    ErrorNum=GetLastError();
    }
    //存放信号样本点
    if (!EnQueue(myQue,data))
    {
    AfxMessageBox("add a data error\n");
    }
    Size=Size-WriteOnce;
    }
    count=QueueLength(myQue);
    AfxMessageBox("信号接受完成");
    CAsyncSocket::OnReceive(nErrorCode);
    }单步调试时程序能走到AfxMessageBox("信号接受完成");,但是正式运行是不会显示AfxMessageBox("信号接受完成");而且对话框界面按钮无法操作。
      

  6.   

    class LogFile
    {
    public:
      static LogFile &instance();
      operator FILE *() const { return m_file; }
    private
      LogFile(const char *filename)
      {
         m_file = fopen(filename, "a+");
      }
      ~LogFile()
      {
         fclose(m_file);
      }
      FILE *m_file;
    };LogFile &LogFile::instance()
    {
       static LogFile log("AppLog.txt");
       return log;
    }用的时候可以这么写:
    fwrite("abc", 1, 3, LogFile::instance());
    看注册时间就知道你是我前辈!
      

  7.   

    在程序中不同的地方多加几条Sleep(500)试试看。