2016-09-02 3 views
0

Я пытаюсь написать рабочую программу, которая принимает данные из сокета UDP и отображает ее в поле управления редактированием при получении данных (Мое воздействие на C++ также составляет около недели : P только сделал встроенный код C раньше). У меня есть рабочая программа, которая может отправлять и выводить данные нажатием кнопки, но я хочу что-то, что может сделать это в режиме реального времени. Цель состоит в том, чтобы масштабировать это в большую программу GUI, которая может отправлять управляющие данные на оборудование и получать от них ответы.Простой UDP-сокет в VC++ MFC

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

  1. Программа просто не выполняет свою OnReceive функции (производной от CAsyncSocket)
  2. Получения функции OnReceive для запуска в отдельном потоке, так что он может еще запускается после того, как нажата кнопка отправки пакета управления клиенту, а затем ожидает ответа в цикле while
  3. Невозможно выводить данные в поле редактирования (с использованием как CEdit a й CString)
  4. ReplaceSel ошибка о том, что тип char несовместима с LPCTSTR

Мой код основан на this codeproject.com tutorial, будучи почти точно, что я хочу, но я получаю ошибку в 4.

EDIT: ошибка в 4. исчезает, когда я меняю ее на TCHAR, но затем выводит случайные китайские символы. Учебник codeproject.com выводит правильные символы независимо от char или TCHAR. Когда отлаженный мой код имеет тип wchar_t, вместо этого введите char, как и другой код.

Chinese output

В рабочей программе echoBuffer[0] характера отправки и отображается был 1

UINT ReceiveData(LPVOID pParam) 
{ 
    CTesterDlg *dlg = (CTesterDlg*)pParam; 
    AfxSocketInit(NULL); 
    CSocket echoServer; 

    // Create socket for sending/receiving datagrams 
    if (echoServer.Create(12345, SOCK_DGRAM, NULL) == 0) 
    { 
     AfxMessageBox(_T("Create() failed")); 
    } 

    for (;;) 
    { // Run forever 

     // Client address 
     SOCKADDR_IN echoClntAddr; 

     // Set the size of the in-out parameter 
     int clntAddrLen = sizeof(echoClntAddr); 

     // Buffer for echo string 
     char echoBuffer[ECHOMAX]; 

     // Block until receive message from a client 
     int recvMsgSize = echoServer.ReceiveFrom(echoBuffer, ECHOMAX, (SOCKADDR*)&echoClntAddr, &clntAddrLen, 0); 
     if (recvMsgSize < 0) 
     { 
      AfxMessageBox(_T("RecvFrom() failed")); 
     } 

     echoBuffer[recvMsgSize] = '\0'; 

     dlg->m_edit.ReplaceSel(echoBuffer); 
     dlg->m_edit.ReplaceSel(_T("\r\n")); 


    } 
} 
+0

Очевидно, что вы делаете это неправильно. Мы не можем вам помочь, если вы не покажете код. Предоставьте [mcve], чтобы сделать этот вопрос полезным (см. Также [ask]). – IInspectable

+0

@Inpectable Я добавил код и отладочное изображение. – C3PO

+0

* «ошибка в 4. исчезает, когда я меняю ее на« TCHAR », но затем выводит случайные китайские символы». * Пожалуйста, прочитайте [работает со строками] (https://msdn.microsoft.com/en-us/ библиотека/windows/desktop/ff381407.aspx) и [Абсолютный минимум Каждый разработчик программного обеспечения абсолютно уверен, должен знать об Unicode и наборах символов (никаких оправданий!)] (http://www.joelonsoftware.com/articles/Unicode.html). – IInspectable

ответ

0

После прочтения ссылки, @IInspectable представленной информации о работе со строками и проверять различие настроек между этими двумя программами стало ясно, что проблема связана с неправильным преобразованием в UNICODE. Моя программа не требует этого, поэтому я отключил его.

Это устранило проблему в 4. и предоставило решения для 2 и 3. Я также думаю, что знаю, почему другой экземпляр моей программы не запускал OnReceive в 1. поскольку этот файл не определялся тем, что была уже запущена программой, но теперь это не имеет значения.