Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MFC服务器应用程序与套接字崩溃,我找不到故障,帮助!_C++_Sockets_Mfc_Crash - Fatal编程技术网

C++ MFC服务器应用程序与套接字崩溃,我找不到故障,帮助!

C++ MFC服务器应用程序与套接字崩溃,我找不到故障,帮助!,c++,sockets,mfc,crash,C++,Sockets,Mfc,Crash,我的程序有一个对话框和两个套接字。两个套接字都是从CAsyncSocket派生的,一个用于侦听,另一个用于从客户端接收数据。当客户端试图连接到服务器应用程序,服务器需要初始化接收套接字时,我的程序崩溃 这是我的MFC对话类 class CFileTransferServerDlg : public CDialog { ... ListeningSocket ListenSock; ReceivingSocket* RecvSock; void OnAccept(); //

我的程序有一个对话框和两个套接字。两个套接字都是从CAsyncSocket派生的,一个用于侦听,另一个用于从客户端接收数据。当客户端试图连接到服务器应用程序,服务器需要初始化接收套接字时,我的程序崩溃

这是我的MFC对话类

class CFileTransferServerDlg : public CDialog
{
   ...
   ListeningSocket ListenSock;
   ReceivingSocket* RecvSock;
   void OnAccept(); // called when ListenSock gets connection attempt
   ...
};
这是我的派生套接字类,用于接收在发出事件信号时调用父对话框方法的数据

class ReceivingSocket : public CAsyncSocket
{
   ...
   CFileTransferServerDlg* m_pDlg; // for accessing parent dialogs controls
   virtual void OnReceive(int nErrorCode);
   ...
}

ReceivingSocket::ReceivingSocket()
{
}
这是dialogs函数,用于在侦听套接字收到事件通知时处理传入连接尝试。这就是坠机发生的地方

void CFileTransferServerDlg::OnAccept()
{   
   RecvSock = new ReceivingSocket;   /* CRASH */
}

当我试图创建一个套接字来接收从客户端应用程序发送的文件时,我的程序崩溃了。当监听套接字发出传入连接尝试的信号时,OnAccept启动,但我的应用程序随后崩溃。有什么不对劲吗? 调试模式下出错:

Unhandled exception at 0x009c30e1 in FileTransferServer.exe: 0xC0000005: Access violation reading location 0xccccce58.
更新:

我编辑了一点代码,发现在定义了Accept的sockcore.cpp中,程序在这行代码上失败:

ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET);
我不明白怎么会这样。ReceivingSocket类在某种程度上没有得到正确的构造。我从CAsyncSock派生它,将构造函数保留为空,无论在哪里创建它,在堆栈上还是在堆上,它总是崩溃

这里是完整的项目,包括客户端和服务器,如果有人可以看一看,我将非常感激。我为这些评论道歉,它们是用克罗地亚语写的


也许可以检查一下您是否正确继承了ReceivingSocket


我已经查过你的密码了。问题似乎是您从未调用ListingSocket::SetParentDlgCFileTransferServerDlg*父。由于您也没有在ListingSocket构造函数中初始化m_pDlg指针,因此它具有随机值,当您访问此指针时,程序可能会在此处或此处崩溃。我也撞车了,但在你指出的另一个地方

我这样改变了它:

CFileTransferServerDlg::CFileTransferServerDlg(CWnd* pParent /*=NULL*/)
   : CDialog(CFileTransferServerDlg::IDD, pParent),
     ListenSock(this)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
在ListingSocket.h中,更改了构造函数:

ListeningSocket(CFileTransferServerDlg* parent);
也在listingsocket.cpp中:

ListeningSocket::ListeningSocket(CFileTransferServerDlg* parent)
   : m_pDlg(parent)
{
}
CFileTransferServerDlg的构造函数更改如下:

CFileTransferServerDlg::CFileTransferServerDlg(CWnd* pParent /*=NULL*/)
   : CDialog(CFileTransferServerDlg::IDD, pParent),
     ListenSock(this)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
坠机消失了。 当然,其他方法也是可能的


顺便说一句,非常不错的小程序:我现在当然要删除它们,因为我可能付不起许可费:

是的,我已经检查过了。它是对话框应用程序,套接字api已正确初始化,继承有效。最有趣的是,在另一台计算机上,该应用程序运行良好。抛出的异常表明这是某种指针初始化错误,但我不知道是什么导致它。更正,它在其他计算机上不能正常工作,测试它的人做得不对。要了解用/*CRASH*/标记的两个代码行上可能发生的情况,可能需要查看ReceivingSocket和ListingSocket类以及ListingSocket.Accept方法的更多信息。特别是第一个崩溃标记表明在构造ReceivingSocket时发生了更复杂的事情,可能是构造另一个类的某个嵌入成员???CAsynSocket的构造函数除了给UINT赋值外,基本上什么都不做。真的很难说…这是OnAccept,它只调用dialogs函数。void ListeningSocket::OnAcceptent nErrorCode{m_pDlg->OnAccept;CAsyncSocket::OnAcceptnErrorCode;}ListeningSocket和ReceivingSocket的构造函数为空。问题是ListeningSocket::Accept not ListeningSocket::OnAccept,因为您已在代码段中标记了该函数的崩溃。我们还可以看到ReceivingSocket的构造函数是空的,但是你的ReceivingSocket类是否有任何复杂的成员,不仅仅是指向对象的指针,还有对象本身?如果是这样的话,它们的构造函数将被ReceivingSocket的构造函数继承调用,可能这些构造函数中出现了问题。我在Accept中找到了抛出异常的位置,并更新了我的问题。ReceivingSocket类没有任何复杂的成员,只有指向父对话框的指针。感谢您的回复。抱歉,我没有注意到ListingSocket类是从CAsynSocket和ReceivingSocket派生的,因此Accept是从CAsyncSocket派生的。谢谢!!!谢谢你的夸奖,这只是我为了练习而做的。在过去的几个月里,我主要是做C,然后又回到这个话题。对于初学者来说,很难轻松地进行上下文切换。再次感谢你救了我的神经!如果代码中的任何内容对任何人都有帮助,请随意使用,我很高兴: