做windows有关socket的课程设计问题 用MFC做的..遇到个问题找不到原因

aftermisak 2012-12-11 07:13:13
线程里代码如图,还有响应消息的函数..问题在于,对方发一次数据(对方的代码绝对正确),这边的recv会接收多次..甚至有时候对方没发数据,recv也会接不断收到空串而不因为对方没发而阻塞(两种情况貌似是随机出现),然后响应函数不断响应..如果对方是发送了数据的情况...那么数据会被在显示的文本空间中反复出现..如果对方是没发数据的情况先出现这个异常..那么显示文本会反复出现“烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫......”(你懂的) 求有经验的前辈告知是什么缘由,如果觉得我描述不够看得懂,加qq879410270 ~~
有一些什么box什么的是我找原因的时候添加的一些代码..错误如我说所说
 DWORD WINAPI CWINCEDlg::FunProc(
LPVOID lpParameter // thread data
)
{
MessageToTh *pmes=(MessageToTh *)lpParameter;
char receive[100];
while(1)
{
recv(pmes->sock,receive,100,0);
CString *ps=new CString(receive);
::PostMessage(pmes->hwnd,WM_RECVDATA,0,(LPARAM)ps);
::MessageBox(pmes->hwnd,"bbbb",NULL,MB_OK);


}
return 0;
}
LRESULT CWINCEDlg::OnRecvData(WPARAM wparam,LPARAM lparam)
{
MessageBox("aaaa");
CString *ps=(CString *)lparam;
CString oldstr;
this->GetDlgItemText(IDC_EDIT1,oldstr);
oldstr+="\r\n";
char a=0;
this->SetDlgItemText(IDC_EDIT1,oldstr+(*ps)+a);a++;
delete(ps);
return 0;
}
...全文
141 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aftermisak 2012-12-12
  • 打赏
  • 举报
回复
引用 10 楼 VisualEleven 的回复:
你得看看你的recv函数的返回值吧,你确定它不是失败,返回SOCKET_ERROR ?
函数确实返回的-1,有错.有没有函数能获得更具体的信息呢..~
Eleven 2012-12-12
  • 打赏
  • 举报
回复
你得看看你的recv函数的返回值吧,你确定它不是失败,返回SOCKET_ERROR ?
YunXia98Li 2012-12-12
  • 打赏
  • 举报
回复
1. 请判断ret=recv()返回值,大于0后才执行后面操作,并设receive[ret]=0。 2. 确定你用的是阻塞socket,如果不是recv就不阻塞。 这有一些socket示例代码,你可以与你的程序互测试,看哪有问题: http://download.csdn.net/detail/geoff08zhang/4571358
aftermisak 2012-12-11
  • 打赏
  • 举报
回复
引用 7 楼 tiger9991 的回复:
奇特啥,你觉得奇特而已,我都回答过N个人问这个问题了。 ps指向的内容不会清空,因为你是new的,没delete,但是你本身ps是临时变量。 循环一次就再见。
哦,你的意思是ps这个变量在while完毕一次后会被释放, 我依照你的改成如下 DWORD WINAPI CWINCEDlg::FunProc( LPVOID lpParameter // thread data ) { MessageToTh *pmes=(MessageToTh *)lpParameter; char receive[100];CString *ps; while(1) { long a; a=recv(pmes->sock,receive,100,0); ltoa(a,receive,10); ::MessageBox(pmes->hwnd,receive,NULL,MB_OK); a=GetLastError(); ltoa(a,receive,10); ::MessageBox(pmes->hwnd,receive,NULL,MB_OK); ps=new CString(receive); ::SendMessage(pmes->hwnd,WM_RECVDATA,0,(LPARAM)ps); } return 0; } 不仅吧ps改成了外部,还把post改成了send.. 反正我对应的问题是肯定没解决.. 不过你这个回答也让我学到了一些~~ 我这里最主要是recv为什么只收到一次数据却可以循环无限次...也就是它变得不阻塞. 然后最后一点...关于你的那句略带蔑视之气的 “奇特啥,你觉得奇特而已,我都回答过N个人问这个问题了”。 你仔细看看这之前我那段话“这个问题我个人觉得可能挺奇特的感觉....”,我用了我个人...和可能..两个定语 来衬托我的矮小... 不愿意回答就算了..不必如此盛气凌人. 那,祝你前途风顺..
傻X 2012-12-11
  • 打赏
  • 举报
回复
奇特啥,你觉得奇特而已,我都回答过N个人问这个问题了。 ps指向的内容不会清空,因为你是new的,没delete,但是你本身ps是临时变量。 循环一次就再见。
aftermisak 2012-12-11
  • 打赏
  • 举报
回复
如果有兴趣又有空的还是加好友聊吧。。 这个问题我个人觉得可能挺奇特的感觉....
aftermisak 2012-12-11
  • 打赏
  • 举报
回复
引用 4 楼 tiger9991 的回复:
线程里面 ::PostMessage(pmes->hwnd,WM_RECVDATA,0,(LPARAM)ps); 别用PostMessage,用SendMessage PostMessage是走消息队列的,回来再找你的ps,ps指针都被释放了。
不会啊,ps的内容是在响应该消息后再On***函数中才释放的。。 而且这也没法解释recv函数为何会反复返回...然而对方只发了一次..或者对方甚至没发..
傻X 2012-12-11
  • 打赏
  • 举报
回复
线程里面 ::PostMessage(pmes->hwnd,WM_RECVDATA,0,(LPARAM)ps); 别用PostMessage,用SendMessage PostMessage是走消息队列的,回来再找你的ps,ps指针都被释放了。
aftermisak 2012-12-11
  • 打赏
  • 举报
回复
哎...仔细看看我问的什么吧... 最主要的问题是为何recv会反复接受相同的信息... 然后另一种是对方没有发任何信息...recv却不阻塞,从而执行了接下来的代码而输出乱码
xumaojun 2012-12-11
  • 打赏
  • 举报
回复
recv的返回值需要检查一下,看看recv函数的说明,socket一段send一个buffer,另一个socket接收数据,不一定能一次性接收完毕,可能多次接收,最后接收的总是和send的一样的,所以recv最后写成一个循环,recv返回0时表示,socket另一端已经关闭。
九州剑王 2012-12-11
  • 打赏
  • 举报
回复
烫烫烫烫烫烫烫烫烫烫烫烫烫烫是因为没有初始化,这个很正常,有3种经常出现的汉字,都是栈、堆什么的没有初始化的,你可以百度下

18,356

社区成员

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

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