UDP Client - версия выпуска не работает только в VS 2005 - PullRequest
1 голос
/ 19 мая 2009

У меня есть простая программа клиент / сервер 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();
}

1 Ответ

0 голосов
/ 19 мая 2009

Вам никогда не нужно добавлять приведения к записям карты сообщений.

Для обработчика ON_MESSAGE тип функции должен быть afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM), поэтому вы должны изменить свою функцию readData с этого:

LRESULT CUDPClientDlg::readData() {
    ...
}

к этому:

LRESULT CUDPClientDlg::readData(WPARAM wParam, LPARAM lParam) {
    ...
}

и удалите приведение, чтобы запись карты сообщения стала:

ON_MESSAGE(WM_SOCKETREAD,readData)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...