关于CSocket的发送数据问题,不太好说,请高手进来帮忙!

雨中的月儿 2008-01-28 11:31:36
目的描述:
(1)A机器开启server socket,负责监听,B机器开启connect socket,与A连接,A在OnAccept()函数中,构造新的socket用于通讯。
(2)B机器每隔100ms向A发送一串数据

实现描述:
(1)A中的server socket为: class CServerSocket : public CSocket
继承CSocket的OnAccept()函数用于建立新的连接
(2)B中的connect socket为: class CConnectSocket : public CSocket
其中使用CArchive和CSockeFile负责序列化通讯,
CSocketFile *m_sfSocketFile = new CSocketFile( this );
CArchive *m_aSessionIn = new CArchive(m_sfSocketFile, CArchive::load);
CArchive *m_aSessionOut = new CArchive(m_sfSocketFile, CArchive::store);

发送数据的函数SendNetMessage()实现部分为
CString sNetMsg = _T("XXXX");
sNetMsg.Serialize(*m_aSessionOut);
m_aSessionOut->Flush();

问题描述:
A机器可能由于网络原因或程序Debug Assertion错误,不正常退出,因此不能通过发送"Quit"的消息给B机器,告知连接断开。所以,B机器经常会弹出“试图写入不存在的文件”错误,我猜测是由于CSocketFile的错误,但不能具体分析出原因。

此外,再请问m_aSessionOut->Flush()是阻塞操作吧?

所以,请高手帮忙,如果解决这个问题,或者,改用其它类来完成这种错误处理。

多谢!



...全文
151 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
A_KIM 2008-01-31
  • 打赏
  • 举报
回复
同意楼上的,用Socket API吧,MFC那个Socket很不好使!
mr.zhoux 2008-01-31
  • 打赏
  • 举报
回复
看来你的东西用到多线程,别用CSocket ,用原始套接字.问题就会简单很多.
yebeans 2008-01-30
  • 打赏
  • 举报
回复
A断开B会有FD_CLOSE(也就是OnClose)通知,处理下就可以了
my_girlf 2008-01-29
  • 打赏
  • 举报
回复
在B中用一时钟去检测A是否掉线.CConnectSocket连接成功才Serialize.
fairyprince 2008-01-29
  • 打赏
  • 举报
回复
你要建立一套自已的协议机制,例如,每隔一定是间发关检测包等手机来检测对方是否已掉线~!
xlzxlich 2008-01-29
  • 打赏
  • 举报
回复
使用 消息
captain_x 2008-01-29
  • 打赏
  • 举报
回复
a中的是不是用了多线程?csocket对多线程支持不行。因为它是用一个隐藏的窗口来接收消息。

18,356

社区成员

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

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