前言
运用在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; //获取数据 } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论