UDP客户端 - 发行版仅在VS 2005中不起作用

时间:2009-05-19 01:03:05

标签: c++ networking mfc

我有一个简单的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();
}

2 个答案:

答案 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 版本不起作用。