sendto 虽然参数是 char const *, 这是历史原因,其实应该是 unsigned char const *.
和字符集没有任何关系。
和字符集没有任何关系。
解决方案 »
- 改变显示器内容
- 问网上找了一线程池代码,但是为啥我使用的时候,有这个问题
- 求助~关于UI线程与工作线程的通讯
- 完成端口 服务端 如何判断 socket客户端 异常断开(比如网线被拔,电线被拔)
- CListCtrl图像列表控件框如果获得InsertItem(1001,"111",3)中的1001参数啊!!!
- 我的vc6.0的dlg的字体怎么这么难看!!
- 如何实现oicq消息发送时的发送快捷键?ctrl+enter
- 请教一简单的问题!
- 如何得到和设置电脑描述
- 我使一个本三计算机系学生,,有些问题想问!
- 内存已分配,但赋值时提示0xffffffff,不可读取内存
- Visual Studio 2012中stl:string 不支持引用计数了吗
接收的时候强制转换为wchar_t *即可
错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets 369 5 Chat Building an MFC project for a non-Unicode character set is deprecated. 在13中,MFC只能选择Unicode 字符集
就意味着只能发送char型数据了吗,当然不是这样的。
它用const char*作参数,意思是按字节发送,具体发送多少个字节由int len参数提供,它不关心发送的具体是什么类型的数据。
所以只要你发送方和接收方约定好了要发送什么数据,然后两边都强制转换即可,注意len参数,只要发送和接收的数据长度正确,就不会丢失数据什么。
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
void main()
{
char ch[100]="中华人民共和国";
wchar_t wch[100] = L"中华人民共和国";
TCHAR str[100] = _T("中华人民共和国"); printf("%s\n", ch);
wprintf(L"%s\n", wch);
_tprintf(_T("%s\n"), str);
system("pause");
}
为什么在多字符集下,第二个输出错误。而在unicode下,第二三个都输出错误?
wchar_t c[20] = L"abc";int sendto(s, (const char FAR *)c, wcslen(c)*sizeof(wchar_t), ...)
接受端则:
char* recivebuf; // 已接受数据buf和 int rlen
wchar_t r[20] = {0}
memcpy(r, recivebuf, rlen);这样即可,跟字符集没关系,关键是buf的发送长度
TCHAR recvBuf[200];
TCHAR recvTmp[300]; while (1)
{
recvfrom(socket, (char*)recvBuf, 200 * sizeof(TCHAR), 0,
(sockaddr*)&addrFrom, &len);
//::AfxMessageBox(recvBuf);
CString strIP(inet_ntoa(addrFrom.sin_addr));
//::AfxMessageBox(strIP);
_stprintf_s(recvTmp,/*300*sizeof(TCHAR)错误*/
_tcslen(recvBuf)*sizeof(TCHAR)+20
/*300*sizeof(TCHAR)-2*/,
_T("%s 说:%s"),strIP.GetBuffer() , recvBuf);
::PostMessage(hWnd, UM_RECVDATA, 0, (LPARAM)recvTmp);
}
这是一个线程中的循环用于接收数据,_stprintf_s(recvTmp,/*300*sizeof(TCHAR)错误*/
_tcslen(recvBuf)*sizeof(TCHAR)+20,
_T("%s 说:%s"),strIP.GetBuffer() , recvBuf);
在这里指定recvTmp的数据大小时为什么注释部分有误呢
int CStringProc::UnicodToAnsi(CString str,char* buff)
{
int len=0;
// UNICODE编码 转换成 ANSI编码
len = ::WideCharToMultiByte(CP_ACP, NULL, str,
str.GetLength(), NULL, 0, NULL, NULL); // 取字串长度
::WideCharToMultiByte(CP_ACP, NULL, str, str.GetLength(),
buff, len, NULL, NULL);
buff[len++]=0x00; // 写字串尾部结束标志 return len; // 转换长度
}