缓冲区的疑问?recvfrom()

namewchlp 2009-05-13 07:15:09
做了点对点的聊天框架 在输入回路IP(127.0.0.1)发送信息时第一条显示没问题 但第二条就出错了

发送函数
CString strsend;
GetDlgItemText(IDC_EDIT2,strsend);
sendto(m_socket,(LPSTR)(LPCTSTR)strsend,2*strsend.GetLength(),0,(SOCKADDR*)&addrto,sizeof(SOCKADDR));

接受函数
CString recv;
CString remp;
int retv;

while(1)
{retv=recvfrom(sock,(LPSTR)(LPCTSTR)recv,200,0,(SOCKADDR*)&addr,&len);
if(SOCKET_ERROR==retv)
{break;}

remp.Format(_T("%s说:%s"),(LPCTSTR) inet_ntoa(addr.sin_addr),recv);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)(LPSTR)(LPCTSTR)recv);//定义了一个消息

消息处理函数

LRESULT Cchat1Dlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
CString str=(LPCTSTR)lParam;
CString strtemp;
GetDlgItemText(IDC_EDIT1,strtemp);
str +="\r\n";
str +=strtemp;
SetDlgItemText(IDC_EDIT1,str);

return 0;
}

结果 第一次发送"hhhh"正常显示,第二次发送"g" 显示"ghhh"

测试了下CString 类 重复赋值 不会保留以前的数据的 但recvfrom 也会清空缓存的 为什么会出现这种情况???



...全文
269 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
biweilun 2009-05-13
  • 打赏
  • 举报
回复
CString recv;
CString remp;
int retv;

while(1)
{
retv=recvfrom(sock,(LPSTR)(LPCTSTR)recv,200,0,(SOCKADDR*)&addr,&len);
if(SOCKET_ERROR==retv)
break;
}

recv[retv] = '\0';
namewchlp 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 biweilun 的回复:]
接受函数
CString recv;
CString remp;
int retv;

while(1)
{retv=recvfrom(sock,(LPSTR)(LPCTSTR)recv,200,0,(SOCKADDR*)&addr,&len);
if(SOCKET_ERROR==retv)
{break;}

remp.Format(_T("%s说:%s"),(LPCTSTR) inet_ntoa(addr.sin_addr),recv);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)(LPSTR)(LPCTSTR)recv);//定义了一个消息

recv.Empty();
消息处理函数

LRESULT  Cchat1Dlg::OnRecvData(WPARAM wPara…
[/Quote]


没用的 我对每个CString 都做了此 Empty();都不能解决这个问题
瓶盒 2009-05-13
  • 打赏
  • 举报
回复
CString 类 重复赋值 不会保留以前的数据的
-----------------------
CString的赋值,效果等同于strcpy(),数据尾要自动添加"\0",接收是不会添加的。
另外用recvfrom(),用CString类接收是不适合的,最好用char []
biweilun 2009-05-13
  • 打赏
  • 举报
回复
接受函数
CString recv;
CString remp;
int retv;

while(1)
{retv=recvfrom(sock,(LPSTR)(LPCTSTR)recv,200,0,(SOCKADDR*)&addr,&len);
if(SOCKET_ERROR==retv)
{break;}

remp.Format(_T("%s说:%s"),(LPCTSTR) inet_ntoa(addr.sin_addr),recv);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)(LPSTR)(LPCTSTR)recv);//定义了一个消息

recv.Empty();

消息处理函数

LRESULT Cchat1Dlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
CString str=(LPCTSTR)lParam;
CString strtemp;
GetDlgItemText(IDC_EDIT1,strtemp);
str +="\r\n";
str +=strtemp;
SetDlgItemText(IDC_EDIT1,str);

return 0;
}
biweilun 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 namewchlp 的回复:]
引用 4 楼 biweilun 的回复:
一个CString类那能叫缓存吗?连缓冲区都不能算,只能算是个接受数据的变量



请问如何定义缓存? 或者说问题如何让解决?
[/Quote]
缓存是系统搞的,和你没关系
namewchlp 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 biweilun 的回复:]
一个CString类那能叫缓存吗?连缓冲区都不能算,只能算是个接受数据的变量
[/Quote]


请问如何定义缓存? 或者说问题如何让解决?
namewchlp 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dengxuxing 的回复:]
sendto(m_socket,(LPSTR)(LPCTSTR)strsend,2*strsend.GetLength(),0,(SOCKADDR*)&addrto,sizeof(SOCKADDR)); 改成:
sendto(m_socket,(LPSTR)(LPCTSTR)strsend,strsend.GetLength(),0,(SOCKADDR*)&addrto,sizeof(SOCKADDR));
[/Quote]

我用的是宽字符 所以要乘以2 这个是没问题的
dengxuxing 2009-05-13
  • 打赏
  • 举报
回复
sendto(m_socket,(LPSTR)(LPCTSTR)strsend,2*strsend.GetLength(),0,(SOCKADDR*)&addrto,sizeof(SOCKADDR)); 改成:
sendto(m_socket,(LPSTR)(LPCTSTR)strsend,strsend.GetLength(),0,(SOCKADDR*)&addrto,sizeof(SOCKADDR));
doudouHuY 2009-05-13
  • 打赏
  • 举报
回复
recvfrom为啥要帮清空
biweilun 2009-05-13
  • 打赏
  • 举报
回复
一个CString类那能叫缓存吗?连缓冲区都不能算,只能算是个接受数据的变量
namewchlp 2009-05-13
  • 打赏
  • 举报
回复
不是说 recvfrom函数会自动清空缓存吗?
biweilun 2009-05-13
  • 打赏
  • 举报
回复
CString recv没有清空,而且你后来又拿它收信了
blackcat242 2009-05-13
  • 打赏
  • 举报
回复
你使用了强制转换导致的,第一次内存的内容是:“hhhh”;第二次你只赋值了g,但是后面的内存并没有清空,实际上是:“ghhhh”

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧