目錄
- 前言
- 一、MFC程序 'inet_pton' 、'CT2A' 未聲明問題
- 1)問題1:'inet_pton' :undeclared identifier - 'inet_pton'未聲明
- 2)問題1:'CT2A' :undeclared identifier - 'CT2A'未聲明
- 二、VS程序 使用事件、委托問題
- 1)問題:無法正確識別DataReceived?.Invoke(this, str);的語法
前言
運用在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; //獲取數據}
}