MFC的Socket套接字

本文详细介绍了MFC中用于网络编程的两种主要类——CAsyncSocket和CSocket的区别。CAsyncSocket提供异步非阻塞通信,适用于长时间运行的应用场景;而CSocket则实现了同步阻塞模式,适用于简单直接的数据交互。文章还提到了如何初始化MFC的socket库以及如何使用这些类进行网络编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要使用MFC的socket类,准备工作和使用API的socket类不同,在加载套接字库时,必须在app类的InitInstance()函数里调用AfxSocketInit函数,AfxSocketInit函数内部将调用WSAStartup函数加载套接字库,并且加载的是1.1版本的套接字库,使用AfxSocketInit函数不需要为工程链接ws2_32.lib库文件。如果AfxSocketInit函数调用成功,函数返回非0值,失败则返回0值。使用AfxSocketInit函数加载套接字库的另一个好处是在程序终止前会自动调用WSACleanup函数终止套接字库使用。因为程序调用了AfxSocketInit函数,所以还必须包含相应的头文件,在stdafx.h中添加#include "afxsock.h"。

问题: CAsyncSocket 和 CSocket 的区别
MFC提供了两个封装socket的类,分别是CAsyncSocket 和 CSocket ,当中CSocket 是由CAsyncSocket 继承的子类,这两个socket类有一个很大的区别,就是CAsyncSocket 是异步套接字而 CSocket是同步套接字,使用MFC的socket类有两个很明显的好处是:
1. 可以从这两个socket类中继承出自己的socket类,从而根据需要增加自己socket类的功能,而且要使用这两个socket类,就一定需要从这两个类中继承出自己的类来使用,因为需要修改虚函数才能实现某些基本功能。

2. 可以方便的处理同步与异步问题。


// 下面三个链接很好的说明和总结了 CAsyncSocket 和 CSocket 的区别

http://blog.youkuaiyun.com/fangle6688/article/details/986808  

http://light6891.blog.163.com/blog/static/969629092009712114239605/

http://blog.youkuaiyun.com/jmcooler/article/details/17258


总结问题: 
CAsyncSocket与CSocket的区别:
前者是异步通信,后者是同步通信;前者是非阻塞模式,后者是阻塞模式。另外,异步非阻塞模式有时也被称为长连接,同步阻塞模式则被称为短连接。
使用同步模式的时候,调用发送/接收函数,函数调用结束时,相应的发送/接收处理已经完成,数据已经被发送/接收到了。

使用异步模式的时候,调用发送/接收函数,函数调用结束时,表示数据已经送达底层去处理了,但是是否处理结束并不知道。你的代码可以继续做其他操作,稍候相应的操作结束时,处理结果会通过事件(或者回调)来告诉调用者。


等稍后有时间 上传下TCP IP UDP的种种.. 

### MFC Socket 中接收中文乱码解决方案 在 MFC 应用程序中使用 `Socket` 接收数据时,如果接收到的数据包含中文字符并出现乱码现象,通常是因为编码不一致引起的。以下是针对该问题的分析以及解决方案。 #### 1. 原因分析 当通过网络传输数据时,发送方和接收方可能采用不同的字符集或编码方式处理字符串。常见的编码方式包括 UTF-8、GBK 和 ASCII 等。如果双方未约定统一的编码标准,则可能导致接收端无法正确解析发送端的字符数据,从而引发乱码问题[^1]。 #### 2. 解决方法 为了确保在网络通信过程中能够正确传递和显示中文字符,可以采取以下措施: ##### (1) 统一编码格式 建议在应用程序设计阶段就明确规定一种通用的编码形式用于整个系统的文本交换过程。例如可以选择广泛支持且兼容性强的标准——UTF-8 编码作为默认选项。这样无论是在 Windows 平台还是其他操作系统环境下都能保持一致性。 ```cpp // 将宽字节串转换成指定编码下的多字节串(如UTF-8) std::string ConvertWideCharToUtf8(const std::wstring& wstrInput){ int nLen = WideCharToMultiByte(CP_UTF8, NULL, wstrInput.c_str(), -1, NULL, 0, NULL, FALSE); char* pszAnsiStr = new char[nLen]; memset(pszAnsiStr,'\0',nLen); WideCharToMultiByte(CP_UTF8,NULL,wstrInput.c_str(),-1,(LPSTR)pszAnsiStr,nLen,NULL,FALSE); std::string strResult((const char*)pszAnsiStr); delete[] pszAnsiStr; return strResult; } ``` ##### (2) 数据接收后的解码操作 假设服务器端按照 GBK 或者 UTF-8 发送过来带有汉字的信息,在客户端需要先读取原始二进制流再依据相应规则将其还原为可识别的文字表示形式。下面给出一段示范代码展示如何利用 MultiByteToWideChar 数完成从特定编码至 Unicode 字符串之间的转变[^1]: ```cpp // 把utf8编码转成Unicode(wchar_t*) void Utf8ToWString(const char* utf8Buf,int iSize,std::wstring &wszOutput){ int widelen=MultiByteToWideChar(CP_UTF8,0,utf8Buf,iSize,nullptr,0); wchar_t *pwch=new wchar_t[widelen+1]; pwch[widelen]='\0'; MultiByteToWideChar(CP_UTF8,0,utf8Buf,iSize,pwch,widelen); wszOutput.assign(pwch); delete []pwch; } // 使用示例 CStringA recvData; // 假设这是接收到的数据 std::wstring unicodeText; Utf8ToWString(recvData.GetBuffer(),recvData.GetLength()*sizeof(char),unicodeText); ``` 以上两部分分别展示了如何进行编码前准备(即把本地使用的宽字符转化为适合网络传播的形式),以及怎样对接受到的内容做适当调整使其恢复正常状态的过程。 #### 3. 总结 综上所述,要彻底解决 MFC 下基于 Sockets 实现通讯时遇到的中文乱码难题,关键是做到两点:一是事先协商好彼此间遵循何种编码协议;二是根据实际情况灵活运用相关 API 完成必要的编/解码工作。只有这样才能保证跨平台应用中的文字交流畅通无阻。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值