关于宽字符(_UNICODE||UNICODE)和windows套接(socket)字编程问题
来源:互联网 发布:c语言重点知识总结 编辑:程序博客网 时间:2024/05/29 18:02
在VS05里使用WSABUF结构体来发送数据的时候会遇到unicode的问题,假如
CString str = L"oh no~";
WSABUF wsaBuf;
int len = str.GetLength();
wsaBuf.buf = str.GetBuffer(len); 的时候会出现不能从wchar_t *转换向char *的错误,翻看WSABUF结构体的MSDN信息,发行没有宽字节版本,send啦recv这些通通没有,解决办法只能自己转换了。
下面是微软论他搜索到的一张帖子:
当用mfc编程用的是宽字符.当用SetDlgItemText();GetDlgItemText();与WSASendTo();WSARecvFrom();这两组函数时前面都是wchar_t*,后面都是char*的参数.我用了mbstowcs_s();wcstombs_s();这两个函数转换.英文、数字和半角标点没问题,但是中文就是转换不了了。有没有能转中文的函数或是有WSASendTo();WSARecvFrom();函数的UNICODE的版本呀。以下是我编写的不能换中文的代码也请大家点评一下。
void CchatDlg:: OnBnClickedBtnSend()
{
DWORD dwIP;
WSABUF wsabuf;
DWORD dwSend;
CString strHostName;
SOCKADDR_IN addrTo;
HOSTENT* pHost;
if(GetDlgItemText(IDC_EDIT_HOSTNAME,strHostName),strHostName=="")
{
((CIPAddressCtrl*)GetDlgItem(IDC_EDIT_ADDR))->GetAddress(dwIP);
addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
}
else
{
size_t cCbuf;
char *buf=new char[2*wcslen(strHostName.GetBuffer())+1];
wcstombs_s(&cCbuf, buf, 2*wcslen(strHostName.GetBuffer())+1, (LPCTSTR)strHostName, 2*wcslen(strHostName.GetBuffer())+1);
pHost=gethostbyname(buf);
delete []buf;
addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
}
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(56789);
LPTSTR lptSend=new wchar_t[100];
GetDlgItemText(IDC_EDIT_SEND,lptSend,100);
size_t convertedChars;
wsabuf.buf=new char[100];
wcstombs_s(&convertedChars, wsabuf.buf , (size_t)2*wcslen(lptSend)+1, lptSend, (size_t)2*wcslen(lptSend)+1);
wsabuf.len=wcslen(lptSend)+1;
SetDlgItemText(IDC_EDIT_SEND,L"");
if(SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,
(SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))
{
MessageBox(L"发送数据失败!");
delete []wsabuf.buf;
return;
}
delete []wsabuf.buf;
delete []lptSend;
}
回贴一:
使用Windows API中的MultiByteToWideChar()和WideCharToMultiByte()函数,注意在参数里面的代码页和转换后的字符串长度。该API使用不当会造成缓冲区溢出攻击漏洞。
回贴二:
字符转换是没有必要的。只要强转buffer的指针就可以了。 LPTSTR lptSend=new wchar_t[100];GetDlgItemText(IDC_EDIT_SEND,lptSend,100);
size_t convertedChars;
wsabuf.buf=new char[100];
wcstombs_s(&convertedChars, wsabuf.buf , (size_t)2*wcslen(lptSend)+1, lptSend, (size_t)2*wcslen(lptSend)+1);
wsabuf.len=wcslen(lptSend)+1;可以写成这样LPTSTR lptSend=new wchar_t[100];
GetDlgItemText(IDC_EDIT_SEND,lptSend,100);
size_t convertedChars;
wsabuf.buf=( char*) lptSend
wsabuf.len=(wcslen(lptSend)+1)*sizeof(wchar_t);
- 关于宽字符(_UNICODE||UNICODE)和windows套接(socket)字编程问题
- Windows编程中UNICODE和_UNICODE定义问题
- Windows编程中UNICODE和_UNICODE定义问题
- Windows编程中UNICODE和_UNICODE定义问题
- Windows编程中UNICODE和_UNICODE定义问题
- VC++ 6.0中关于UNICODE和_UNICODE的问题总结
- Windows编程,UNICODE,_UNICODE有什么区别
- Windows套接字编程/Socket
- UNICODE和_UNICODE
- Unicode和_UNICODE
- 套接字和socket编程
- windows——UNICODE _UNICODE
- Windows Socket网络编程--异步套接字
- Windows Socket 套接字编程原理(转载)
- Windows Socket 套接字编程原理(转载)
- Windows Socket 套接字编程原理(转载)
- Windows Socket 网络编程--异步套接字
- Windows 下的socket(套接字编程)
- wince6 应用程序杀掉其他进程
- 面试感想之二
- C语言中解决变参问题的几个宏
- 每人都有两大炸弹的扎金花2012
- 嵌入式linux学习笔记之入门知识
- 关于宽字符(_UNICODE||UNICODE)和windows套接(socket)字编程问题
- 修改js Date对象添加年月日
- Socket通信(续)
- 去除织梦后台的赞助商广告
- 第三章 控制程序流程
- 遗传算法GA笔记之简述
- mina框架详解
- virtualbox openSUSE和windowss共享文件夹设置
- There is no build provider registered for the extension '.cshtml'.