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

时间:2016-09-02 14:51:19

标签: sockets visual-c++ mfc udp textbox

我一直在尝试编写一个工作程序,它从UDP套接字中获取数据并在接收数据时将其显示在编辑控制框中(我对c ++的曝光时间也只有一周左右:P只进行了嵌入式操作C代码之前)。我有一个工作程序,可以通过按钮点击发送和输出数据,但我想要一些可以实时完成的东西。目标是将其扩展为更大的GUI程序,该程序可以将控制数据发送到硬件并从中获取响应。

我遇到了各种各样的问题,包括:

  1. 该程序只是没有执行我的OnReceive函数(派生自 CAsyncSocket
  2. OnReceive函数在单独的线程上运行,以便在单击按钮后仍然可以运行,然后将控制数据包发送到客户端,然后在while循环中等待响应
  3. 无法在编辑框中输出数据(尝试同时使用CEditCString
  4. ReplaceSel错误,指出char类型与LPCTSTR
  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] = '\0';
    
            dlg->m_edit.ReplaceSel(echoBuffer);
            dlg->m_edit.ReplaceSel(_T("\r\n"));
    
    
        }
    }
    

1 个答案:

答案 0 :(得分:0)

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

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