关于宽字符(_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);
原创粉丝点击