MFC socket client unicode

MFC socket client

在这里插入图片描述

unicode1

接收的字符串也要A2W转一下 建议A2W改成A2T,W2A改成T2A

unicode2

  VC6.0中默认使用的是多字节编码,而从VS2005以后,默认使用的是Unicode字符编码方式,尤其在VS2013中还取消了对于多字节编码的支持,需要额外安装插件。如果使用多字节编码就不会遇到本文所说的问题,但是用Unicode字符编码方式也是有好处的,除了支持程序主题更美观,更重要的是统一编码标准。这或许就是vs中取消多字节编码的一个原因吧。

   好,切入正题。在socket编程中,如果使用的Unicode编码,接收的到数据会发生乱码或者只接收到了第一个字符,那么要如何解决呢?我们只需要在发送数据的时候通过以下方式进行转换,就能够正常运行了:
int nLen;
char * wsabuf = NULL;
#ifdef _UNICODE
	//CString转换成char*
	USES_CONVERSION;
	wsabuf = W2A(m_strMsg);//m_strMsg为CString消息
	nLen = strlen(wsabuf);
	nSent = m_sConnectSocket.Send(wsabuf, nLen);//发送数据
#else
	nLen = m_strMsg.GetLength();
	nSent = m_sConnectSocket.Send(LPCTSTR(m_strMsg), nLen);//发送数据
#endif

注意如果出现函数未定义的错误就包含一下头文件://#include <afxconv.h>

3

发送前转成CHAR.
<windows网络编程> 第七章:
必须牢牢记住这一点:所有关系到收发数据的缓冲都属于简单的c h a r类型。也就是说,这
些函数没有“U n i c o d e”版本。这一点对Windows CE来说尤为重要,因为Windows CE默认使
用U n i c o d e。使用U n i c o d e时有一种选择,即把字符串当作c h a r *或把它造型为c h a r *发送。需要
注意的是,在利用字符串长度函数告诉Winsock API函数收发的数据有多少字符时,必须将这
个值乘以2,因为每个字符占用字串组的两个字节。另一种选择是在将字串数据投给Wi n s o c k
A P I函数之前,用Wi d e C h a r To M u l t i B y t e把U N I C O D E转换成A S C I I码。

4

在这里插入图片描述
在这里插入图片描述

5

在这里插入图片描述

CString to char * ------- socket send
char* to CString ------- socket recv

Guess you like

Origin blog.csdn.net/wowocpp/article/details/121604342