您的位置:首页 > 编程语言

关于宽字符(_UNICODE||UNICODE)和windows套接(socket)字编程问题

2012-07-18 14:16 357 查看
在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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: