我一直在尝试编写一个工作程序,它从UDP套接字中获取数据并在接收数据时将其显示在编辑控制框中(我对c ++的曝光时间也只有一周左右:P只进行了嵌入式操作C代码之前)。我有一个工作程序,可以通过按钮点击发送和输出数据,但我想要一些可以实时完成的东西。目标是将其扩展为更大的GUI程序,该程序可以将控制数据发送到硬件并从中获取响应。
我遇到了各种各样的问题,包括:
OnReceive
函数(派生自
CAsyncSocket
)OnReceive
函数在单独的线程上运行,以便在单击按钮后仍然可以运行,然后将控制数据包发送到客户端,然后在while循环中等待响应CEdit
和CString
)ReplaceSel
错误,指出char
类型与LPCTSTR
我的代码基于this codeproject.com tutorial,几乎正是我想要的,但我在4中得到错误。
编辑:当我将其更改为TCHAR
时,4中的错误消失,但随后输出随机的中文字符。无论char
或TCHAR
声明如何,codeproject.com教程都会输出正确的字符。调试时,我的代码的类型为wchar_t
,而不是像其他代码一样输入char
。
在工作程序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 :(得分:0)
在阅读了@IInspectable提供的关于使用字符串并检查两个程序之间的设置差异的链接后,很明显问题在于转换为UNICODE。我的程序不需要它,所以我禁用了它。
这已经解决了4中的问题,并为2和3提供了解决方案。
我也想知道为什么我的程序的另一个实例不会在1中运行OnReceive
,因为该文件不是由程序运行的那个文件定义的,但现在已经无关紧要了。