Socket显示接受数据问题 1.请把char buf[1000];清空memset()2.接收数据流出最后‘\0’的位置,不然字符串没有结尾,就会有问题,接收999字节,不要1000 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VOID mysocket::OnReceive(int nConnectCode){char buf[1000];// CString streV;int flen;flen=newsocket->Receive(buf,1000);buf[flen]="\0";CString streV(buf);Dlg->Display(streV);CSocket::OnReceive(nConnectCode);}其中newsocket是在与客户端创立连接后创建的派生类指针,显示用到Display()函数,测试没有问题VOID CWifiserverDlg::Display(CString infoM){m_client+=infoM;m_client+="\r\n";//换行回车UpdateData(FALSE);m_Control_client.LineScroll(m_Control_client.GetLineCount(),0);//显示控件} 1、在通信中接收事件是一个很重要的处理事件,最好不要延迟,因此,不要将显示与接收放在同一个线程中处理。可以将通信做成一个独立线程,在主控程序完成显示,当收到数据后用消息将数据传送给主控程序显示。2、注意字符串的制式,现在编译器多为Unicode,如果传送的字符为ANSI就必须在显示前进行转换。以下2个转换函数供参考:.H // ANSI To UNCODE转换 CString AnsiToUnicode(char * szAnsi, int len=0); // Unicod To ANSI转换 int UnicodToAnsi(CString str,char* buff);.CPP// ANSI To UNCODE转换CString CXXXX::AnsiToUnicode(char * szAnsi, int len){ CString str; // ansi to unicode //预转换,得到所需空间的大小 int wcsLen; if(len>0) wcsLen=len; else wcsLen= ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0); //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间 wchar_t* wszString = new wchar_t[wcsLen + 1]; //转换 ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen); //最后加上'\0' wszString[wcsLen] = '\0'; // UNICODE字串 str=wszString; delete wszString; return str;}// Unicod To ANSI转换int CXXXX::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; // 转换长度} 拖动弹出对话框或弹出消息框困难 如何在标题栏的正中显示文字,在有的电脑上,执行后文字前的空格变少了,怎么办好?见代码 如何使窗体中的按钮、链接等失效 MDI怎么切分啊???1-N ip地址问题 问 int*(*ptr)[4];是什么意思? 多编辑框问题: 请问win2000下如何用程序判断用户是否管理员? 如何在VC中使用ADO Win32有exe与dll之间数据共享的机制吗? CListCtrl的问题啊,大神门,带我飞啊 关于Bitmap 绘制Dialog界面的问题
{
char buf[1000];
// CString streV;
int flen;
flen=newsocket->Receive(buf,1000);
buf[flen]="\0";
CString streV(buf);
Dlg->Display(streV);
CSocket::OnReceive(nConnectCode);
}
其中newsocket是在与客户端创立连接后创建的派生类指针,显示用到Display()函数,测试没有问题
VOID CWifiserverDlg::Display(CString infoM)
{
m_client+=infoM;
m_client+="\r\n";//换行回车
UpdateData(FALSE);
m_Control_client.LineScroll(m_Control_client.GetLineCount(),0);//显示控件
}
2、注意字符串的制式,现在编译器多为Unicode,如果传送的字符为ANSI就必须在显示前进行转换。以下2个转换函数供参考:
.H // ANSI To UNCODE转换
CString AnsiToUnicode(char * szAnsi, int len=0);
// Unicod To ANSI转换
int UnicodToAnsi(CString str,char* buff);.CPP// ANSI To UNCODE转换
CString CXXXX::AnsiToUnicode(char * szAnsi, int len)
{
CString str;
// ansi to unicode
//预转换,得到所需空间的大小
int wcsLen;
if(len>0)
wcsLen=len;
else
wcsLen= ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
//最后加上'\0'
wszString[wcsLen] = '\0'; // UNICODE字串
str=wszString;
delete wszString;
return str;
}// Unicod To ANSI转换
int CXXXX::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; // 转换长度
}