Unicode下,socket的Sendto/RecvFrom函数的使用
2016-06-27 14:08
316 查看
有:cstring strSend(_T("how are your!")) ;
需要用socket函数send/sendto来发送:
int len = strSend.GetLength() ;
DWORD dwIP ;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP) ;
SOCKADDR_IN addrTo;
ZeroMemory(&addrTo, sizeof(SOCKADDR_IN)) ;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6000);
// addrTo.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrTo.sin_addr.S_un.S_addr=htol(dwIP) ;//通过IP空件获取IP地址
int retint = sendto(m_socket,(char*)strSend.GetBuffer(len*2),len*2+2,0,
(SOCKADDR*)&addrTo,sizeof(SOCKADDR));//对于unicode字符类型,由于在内存中占2个内存长度(2个char),getlength()是获取unicode字符串中字符的长度,send/sendto对应的发送的却是char*类型,所以发送字节长度一定为字符串长度+1的两倍;
if (SOCKET_ERROR == retint)
{
return ;
}
strSend.ReleaseBuffer(len*2) ;
用recv/recvfrom来接收:
SOCKADDR_IN addrFrom;
ZeroMemory(&addrFrom, sizeof(SOCKADDR_IN)) ;
int len=sizeof(SOCKADDR);
TCHAR recvBuf[200];//unicode字符类型
TCHAR tempBuf[300];
int retval;
while(TRUE)
{
retval=recvfrom(sock,(char*)recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);//recvBuf强制转换一下就行了。
if(SOCKET_ERROR==retval)
break;
wsprintf(tempBuf,_T("说: %s"),recvBuf);//用unicode对应的格式化输出;
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
总结:在unicode环境下编程,遇到参数为char*的函数,或者需要在char* 与tchar之间转换时,转换的长度一定是
char* = 2*(1+wcslen(tchar)) ;
需要用socket函数send/sendto来发送:
int len = strSend.GetLength() ;
DWORD dwIP ;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP) ;
SOCKADDR_IN addrTo;
ZeroMemory(&addrTo, sizeof(SOCKADDR_IN)) ;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6000);
// addrTo.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrTo.sin_addr.S_un.S_addr=htol(dwIP) ;//通过IP空件获取IP地址
int retint = sendto(m_socket,(char*)strSend.GetBuffer(len*2),len*2+2,0,
(SOCKADDR*)&addrTo,sizeof(SOCKADDR));//对于unicode字符类型,由于在内存中占2个内存长度(2个char),getlength()是获取unicode字符串中字符的长度,send/sendto对应的发送的却是char*类型,所以发送字节长度一定为字符串长度+1的两倍;
if (SOCKET_ERROR == retint)
{
return ;
}
strSend.ReleaseBuffer(len*2) ;
用recv/recvfrom来接收:
SOCKADDR_IN addrFrom;
ZeroMemory(&addrFrom, sizeof(SOCKADDR_IN)) ;
int len=sizeof(SOCKADDR);
TCHAR recvBuf[200];//unicode字符类型
TCHAR tempBuf[300];
int retval;
while(TRUE)
{
retval=recvfrom(sock,(char*)recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);//recvBuf强制转换一下就行了。
if(SOCKET_ERROR==retval)
break;
wsprintf(tempBuf,_T("说: %s"),recvBuf);//用unicode对应的格式化输出;
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
总结:在unicode环境下编程,遇到参数为char*的函数,或者需要在char* 与tchar之间转换时,转换的长度一定是
char* = 2*(1+wcslen(tchar)) ;
相关文章推荐
- java-模拟tomcat服务器
- Linux socket 初步
- Linux 与 Windows 对UNICODE 的处理方式
- java socket 注意的地方
- java socket 注意的地方
- C#基于socket模拟http请求的方法
- Unicode详细分析解释
- 简单的Ruby中的Socket编程教程
- Socket不能选择本地IP连接问题如何解决
- C#之Socket操作类实例解析
- vbs中将GB2312转Unicode的代码
- 使用C#来编写一个异步的Socket服务器
- C#使用Socket快速判断数据库连接是否正常的方法
- 程序员趣味读物 谈谈Unicode编码
- 科学知识:理解socket
- websocket++简单使用及实例分析
- 常用字符集编码详解(ASCII GB2312 GBK GB18030 unicode UTF-8)
- C#实现Json转Unicode的方法
- Android聊天工具基于socket实现
- php与flash as3 socket通信传送文件实现代码