WinSock接收数据问题,高手来接分了!

heavenb 2004-09-23 12:10:31
为什么当我定义rbuf接收数据的缓冲区为CString类型时,Recv总是返回0,然后马上又响应一次FD_Read事件,Recv返回-1,接收过程失败?

请问是什么原因?

BOOL CServerDlg::OnSendin() //响应FD_Read事件的函数
{

// strcpy(rbuf,"");

RecvOK=recv(SOCKET_ON,(LPTSTR)(LPCTSTR)rbuf,rbuf.GetLength(),0);
// RecvOK=recv(SOCKET_ON,rbuf,strlen(rbuf),0);

//AfxMessageBox("Sendin");

if(RecvOK!=SOCKET_ERROR)
{
// AfxMessageBox(rbuf);
m_EditLog.SetSel(-1,-1);
m_EditLog.ReplaceSel("服务器端正在接收数据!\n");
m_EditMsg.SetSel(-1,-1);
m_EditMsg.ReplaceSel(rbuf);

}
else
{
AfxMessageBox("Recv Faild!");
}
closesocket(SOCKET_ON);
m_EditLog.SetSel(-1,-1);
m_EditLog.ReplaceSel("SOCKET_ON已经关闭!\n");
return true;
}
...全文
115 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdy119 2004-09-23
  • 打赏
  • 举报
回复
代码很乱,建议先看点《网络编程技术》这本书
taolei 2004-09-23
  • 打赏
  • 举报
回复
能说一点是一点吧。
1。接收的buffer不能使用CString或其他不能保证足够大的buffer.CString能自动调整buffer大小的前提是它知道被付值的string的大小。
2。TCP/IP协议的数据传输是流化的。并不是你每次发送多少,每次接收就有多少。一次发送的数据可能分两次才能接收到,多次发送的数据也可能一次都接收到,甚至更复杂。
3。关于异步socket的发送和接受,就更复杂了,不能保证每次发送和接受都成功,还要处理WSAE_WOULDBLOCK的错误。

基本上,你这程序得重写。论坛上只能就个别问题给你提供帮助,打基础的事儿你得自己下功夫了。
taolei 2004-09-23
  • 打赏
  • 举报
回复
这个关于string、buffer以及异步socket的基本概念都没有掌握好,几句话好像不容易说清楚哦。
cpmax 2004-09-23
  • 打赏
  • 举报
回复
当然不能这样定义接收的响应函数,这样做是响应不了的!

18,356

社区成员

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

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