我写的聊天程序,用的UDP协议,一个主线程,和一个线程。
为什么用reavfrom接收的信息总是不全,信息总是隔个字符才收到一个。
比如:我发送abcdef字符串,在我接收的字符数组里char[0]='a',char[1]为空,char[2]='b',char[3]又为空,char[4]='c',char[5]又为空,然后以后的全都为空了。
为什么用reavfrom接收的信息总是不全,信息总是隔个字符才收到一个。
比如:我发送abcdef字符串,在我接收的字符数组里char[0]='a',char[1]为空,char[2]='b',char[3]又为空,char[4]='c',char[5]又为空,然后以后的全都为空了。
解决方案 »
- 一个服务器4块网卡 网络编程的问题!
- 在xp上做的ActiveX程序在win7系统上编译出错怎么解决?
- mfc的循环
- 急救,请问为什么我在vc中用正弦和反正弦函数,编译提示说不认识这两个函数?
- 超高难度的数组排序问题,完成了另开贴子多给分,我一次只能给100
- 两个视图怎样传送信息好?在线等!解决立即给分!
- 关于Bitmap的导入问题
- 源文件太长无法编译?
- 求救,MFC 在对话框里面拖一个listCtrl控件 如何单独将对他的操作方法都放到新建的一个类里面
- (!又是送分题)自定义了一个类后,在什么地方定义一个对象使得在*View.cpp中的多个函数都能用到这个对象??(注意:这里的多个函数都是对同一个对象进行操作) (希望能讲的理由,谢谢!!!)
- 播放raw文件
- 工程中添加c文件
我接收的数组声明为:char recvBuf[200];
接收信息的代码为:recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
麻烦说详细一点哈。。
谢谢!
CString sendStr("");
GetDlgItemText(IDC_EDIT_SEND,sendStr);
sendto(m_socket,((const char *)((LPCTSTR)sendStr)),sendStr.GetLength()*2,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
然后用字符数组储存接收到的数据:
char recvBuf[200];
recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len); 调试的时候,得到sendStr中的值为原来的字符串,但recvBuf数组的字符就像上面我说那样了。
麻烦高手说一下我改怎么改,看上面几楼的回复,我还是不知道怎么改啊~~
麻烦改一下啊,加上代码,尽量详细点,谢谢!!!
我的解决办法是将sendto函数的第3个参数改成sendStr.GetLength()*2,但是这样浪费了recvBuf一半的字符空间!因为它接收时总是一个字符有,下个字符就为空了。
有其它的解决方法没?
{
static char szConvert[DEF_COM_BUF] = {0};
DWORD dwMinSize;
try{
ZeroMemory(szConvert, sizeof(szConvert)); dwMinSize = WideCharToMultiByte(CP_OEMCP, NULL, lpszSource, -1, NULL, 0, NULL, FALSE); if (dwMinSize < DEF_COM_BUF) {
WideCharToMultiByte(CP_OEMCP, NULL, lpszSource, -1, szConvert, dwMinSize * sizeof(char), NULL, FALSE);
if (pszConvert)
strcpy_s(pszConvert,strlen(szConvert) + 1, szConvert);
}
else{
strcpy_s(pszConvert, DEF_COM_BUF-1, szConvert);
g_LogFile->TraceLog(__FILE__, __LINE__, _T("[ERROR] : INSUFFICIENT_BUFFER"));
}
}
catch (CMemoryException* pEx) {
TCHAR szError[DEF_TEMP_BUF] = {0};
pEx->GetErrorMessage(szError, DEF_TEMP_BUF);
g_LogFile->TraceLog(__FILE__, __LINE__, _T("[ERROR] : Memory exception:[%s]"), szError);
pEx->Delete();
}
return szConvert;
}加入以上函数(需要稍加修改),sendto(m_socket,((const char *)(UnicodeToAnsi(sendStr.GetBuffer())),sendStr.GetLength(),0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR)); 试试这样.