VC++ MFC 中的简单 UDP 套接字
Simple UDP socket in VC++ MFC
我一直在尝试编写一个工作程序,该程序从 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] = '[=11=]';
dlg->m_edit.ReplaceSel(echoBuffer);
dlg->m_edit.ReplaceSel(_T("\r\n"));
}
}
在阅读了@IInspectable 提供的关于使用字符串并检查两个程序之间的设置差异的 link 之后,很明显问题在于不正确地转换为 UNICODE。我的程序不需要它,所以我禁用了它。
至此解决了4中的问题,并为2和3提供了解决方案。
我也想我知道为什么我的程序的另一个实例不会 运行 OnReceive
in 1. 因为那个文件没有被程序已经 运行 定义,但是那个现在无关紧要了。
我一直在尝试编写一个工作程序,该程序从 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] = '[=11=]';
dlg->m_edit.ReplaceSel(echoBuffer);
dlg->m_edit.ReplaceSel(_T("\r\n"));
}
}
在阅读了@IInspectable 提供的关于使用字符串并检查两个程序之间的设置差异的 link 之后,很明显问题在于不正确地转换为 UNICODE。我的程序不需要它,所以我禁用了它。
至此解决了4中的问题,并为2和3提供了解决方案。
我也想我知道为什么我的程序的另一个实例不会 运行 OnReceive
in 1. 因为那个文件没有被程序已经 运行 定义,但是那个现在无关紧要了。