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