VC++ MFC 中的简单 UDP 套接字

Simple UDP socket in VC++ MFC

我一直在尝试编写一个工作程序,该程序从 UDP 套接字获取数据并在您接收数据时将其显示在编辑控制框中(我接触 C++ 也只有大约一个星期 :P 只有之前完成了嵌入式 C 代码)。我有一个可以在单击按钮时发送和输出数据的工作程序,但我想要一些可以实时执行的程序。目的是将其扩展为更大的 GUI 程序,该程序可以将控制数据发送到硬件并从中获得响应。

我 运行 遇到各种问题,包括:

  1. 程序没有执行我的 OnReceive 函数(源自 CAsyncSocket)
  2. 在单独的线程上将 OnReceive 函数设置为 运行,以便在单击按钮后它仍然可以 运行 向客户端发送控制数据包,然后等待在 while 循环中响应
  3. 无法在编辑框中输出数据(尝试使用CEditCString
  4. ReplaceSel 错误说类型 charLPCTSTR
  5. 不兼容

我的代码基于 this codeproject.com tutorial,几乎正是我想要的,但我在 4.

中遇到了错误

编辑:当我将其更改为 TCHAR 时,4. 中的错误消失了,但随后它输出了随机的汉字。无论 charTCHAR 声明如何,codeproject.com 教程都会输出正确的字符。调试时,我的代码具有类型 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] = '[=11=]';

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


    }
}

在阅读了@IInspectable 提供的关于使用字符串并检查两个程序之间的设置差异的 link 之后,很明显问题在于不正确地转换为 UNICODE。我的程序不需要它,所以我禁用了它。

至此解决了4中的问题,并为2和3提供了解决方案。 我也想我知道为什么我的程序的另一个实例不会 运行 OnReceivein 1. 因为那个文件没有被程序已经 运行 定义,但是那个现在无关紧要了。