我有一个简单的UDP客户端/服务器程序,它发送(服务器)文本字符串并接收(客户端)该文本字符串以显示在对话框上。这是一个MFC C ++程序,我在Visual Studio 6.0,Visual Studio 2003中都可以在调试和发布版本中正常工作。我试图在Visual Studio 2005上执行相同的代码,不幸的是UDP客户端似乎只在调试模式下工作,而不是在发布模式下。如果我尝试在发布模式下运行UDP客户端可执行文件,会发生以下情况:当UDP客户端从服务器接收数据包时,我的读取函数被调用,它接收数据并退出我的对话框,只是退出... 。 我注释掉了我的OnOK(),OnCancel()函数,以查看它们是否在收到数据包后被调用,但事实并非如此。它通过我的整个读取功能,只是退出,就像它没有回到对话框....
同样,请记住,我在调试和发布模式下都在VS 6,VS 2003中使用相同的代码,但我必须在VS 2005中使用它
我已经包含了一些代码,如果有人能够对可能发生的事情有任何了解,我会非常感谢它。
顺便说一句,我已尝试在发布模式下设置项目属性以禁用优化等,看看是否会导致任何问题,但仍然没有运气......
以下是我的UDP客户端应用程序的实现文件中的内容:
BEGIN_MESSAGE_MAP(CUDPClientDlg, CDialog)
ON_MESSAGE(WM_SOCKETREAD,(LRESULT(AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))readData)
END_MESSAGE_MAP()
BOOL CUDPClientDlg::OnInitDialog()
{
// Socket Initialization
WSADATA data;
if (WSAStartup(MAKEWORD(2,2), &data) != 0) return(0);
int ret;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (!sock)
{
WSACleanup();
return(0);
}
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY;
saServer.sin_port = htons(0x1983);
et = bind(sock, (SOCKADDR *)&saServer, sizeof(SOCKADDR));
WSAAsyncSelect(sock, this->m_hWnd, WM_SOCKETREAD, FD_READ);
}
LRESULT CUDPClientDlg::readData()
{
char bufferTMP[4096];
memset(bufferTMP, '\0', sizeof(bufferTMP));
socklen_t fromaddrLen = sizeof(fromSockAddr);
recvfrom(sock, bufferTMP, sizeof(bufferTMP)-1, 0, (struct sockaddr*)
&fromSockAddr, &fromaddrLen);
SetDlgItemText(IDC_EDIT1, bufferTMP);
return 1;
}
void CUDPClientDlg::OnExit()
{
closesocket(sock);
WSACleanup();
OnOK();
}
答案 0 :(得分:0)
您永远不需要将演员表添加到消息映射条目。
对于ON_MESSAGE
处理程序,函数的类型必须为afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM)
,因此您应该更改readData
函数:
LRESULT CUDPClientDlg::readData() {
...
}
到此:
LRESULT CUDPClientDlg::readData(WPARAM wParam, LPARAM lParam) {
...
}
并删除强制转换,以便消息映射条目变为:
ON_MESSAGE(WM_SOCKETREAD,readData)
答案 1 :(得分:0)
Windows 防火墙也可能导致 Release 版本不起作用。