目录
前言
运用在windows xp环境下调试,发现有些方法是在xp环境下不能实现的,今天将mfc程序和C#程序修改的方面进行总结
一、MFC程序 ‘inet_pton’ 、‘CT2A’ 未声明问题
在VC++6.0中加入新编写的代码,会报上述问题,主要是因为该老旧开发环境与现代API和ATL/MFC宏的兼容性问题。
1)问题1:‘inet_pton’ :undeclared identifier - 'inet_pton’未声明
其原因:
- inet_pton 是较新的POSIX标准函数,VC6 默认不支持(需Windows SDK 8.0+)。
- VC6 自带的 wsock32.h 仅提供旧版函数如 inet_addr。
解决方法:改用inet_addr,代码更改如下:
BOOL CSocketNet::ServerSet()
{
// 设置服务器地址
server.sin_family = AF_INET;
server.sin_port = htons(8888); // 服务器端口
server.sin_addr.s_addr = inet_addr("127.0.0.1");
if (server.sin_addr.s_addr == INADDR_NONE)
{
closesocket(clientSocket);
WSACleanup();
AfxMessageBox(_T("设置服务器地址失败!"), MB_OK | MB_ICONINFORMATION);
return FALSE;
}
else
{
return TRUE;
}
}
2)问题1:‘CT2A’ :undeclared identifier - 'CT2A’未声明
其原因:
- CT2A 是ATL/MFC的字符串转换宏,VC6 默认未启用ATL支持。
解决方法:强制使用ANSI版本 - 代码如下:
BOOL CSocketNet::SendMes(CString str) {
// 强制转换为ANSI字符串(VC6默认字符集)
LPCSTR ansiMsg = (LPCSTR)str; // 直接转换(仅当str为ANSI时安全)
if (send(clientSocket, ansiMsg, strlen(ansiMsg), 0) < 0) {
return FALSE;
}
return TRUE;
}
二、VS程序 使用事件、委托问题
1)问题:无法正确识别DataReceived?.Invoke(this, str);的语法
其原因:
- C# 版本兼容性问题
?.(null 条件运算符)和 Invoke 的事件触发语法需要 C# 6.0+。如果你的项目使用的是旧版 C#(如 5.0),会报语法错误。 - 事件委托类型不匹配
EventHandler 是标准事件委托类型,但可能因项目配置导致编译器无法识别其 Invoke 方法。
解决方法:使用传统事件触发方式,代码如下:
1、在需事件监听的类中,以CodeService类为例,编写如下代码:
namespace ConsoleApplocational.Service
{
// 定义委托,用于事件处理程序的签名
public delegate void DataReceivedEventHandler(object sender,string data);
class CodeService
{
...
}
}
2、在CodeService类中定义事件并实现触发方法,代码如下:
class CodeService
{
// 定义事件
public event DataReceivedEventHandler DataReceived;
。。。
}
3、在CodeService类中的对应方法触发事件,代码如下:
void HandleClient(TcpClient client)
{
using (client)
{
using (var stream = client.GetStream())
{
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received from C++:" + receivedData);
// 触发事件
if(DataReceived != null)
{
DataReceived(this, receivedData);
}
}
}
}
}
4、在main函数里,跟之前一样定义,代码如下:
namespace ConsoleApplication1
{
static void Main(string[] args)
{
CodeService codeService = new CodeService();
codeService.DataReceived += OnDataReceived; // 订阅事件
}
public static void OnDataReceived(object sender, string data)
{
StrLine = data; //获取数据
}
}