求解:关于CSocket问题,十分不解,[服务端接收不到已经已由客户端发到服务端的包]

Flysnow 2001-12-30 01:08:09
问题:服务端已经和客户端建立好了Socket连接,而且客户端已经成功向服务端发送包,服务端已经收到,但是,当客户端发送一定量包后,服务端就开始收不到任何响应,但通过win2000的网络监视器已经肯定客户的包已经通过网络发到了服务器,但是服务端软件却没有收到这个包,而且以后所有的包都只能发到服务器,但是服务端收不到。

请求问题的原因?

附:现使用网络类实现定义及函数(服务端和客户端使用相同的网络通讯类CCommSocket)

////CommSocket.h

class CCommSocket : public CSocket
{
public:
CSocketFile* m_pFile;
CArchive* m_pArchiveIn;
CArchive* m_pArchiveOut;
CString m_strText;
CStringList m_msgList;

public:
CCommSocket();
virtual ~CCommSocket();
virtual void Serialize(CArchive& ar);
// 初始化客户Socket
void InitSocket(void);
// 客户接收信息
void ReceiveMsg(void);
// 向客户发送消息
void SendMsg(CString& strText);
virtual void OnReceive(int nErrorCode);
};


///////////CommSocket.cpp

#include "stdafx.h"
#include "CommSocket.h"

// CCommSocket
CCommSocket::CCommSocket()
{
m_pFile = NULL;
m_pArchiveIn = NULL;
m_pArchiveOut = NULL;
m_strText = _T("");
m_msgList.RemoveAll();
}

CCommSocket::~CCommSocket()
{
if (m_pArchiveOut != NULL)
delete m_pArchiveOut;
if (m_pArchiveIn != NULL)
delete m_pArchiveIn;
if (m_pFile != NULL)
delete m_pFile;
}

void CCommSocket::InitSocket(void)
{
m_pFile = new CSocketFile(this);
m_pArchiveIn = new CArchive(m_pFile, CArchive::load);
m_pArchiveOut = new CArchive(m_pFile, CArchive::store);
}

void CCommSocket::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar<<m_strText;
}
else
{ // loading code
ar>>m_strText;
}
m_msgList.Serialize(ar);
}

void CCommSocket::ReceiveMsg(void)
{
Serialize(*m_pArchiveIn);
}

void CCommSocket::SendMsg(CString &strText)
{
if (m_pArchiveOut != NULL)
{
m_strText = strText;
Serialize(*m_pArchiveOut);
m_pArchiveOut->Flush();
}
}

void CCommSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
}
^^^^^^^^^^^^^^^^^^^^^^^^^^^问题出在这里,这里就是显示收不到包
...全文
199 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
MoreBug 2001-12-31
  • 打赏
  • 举报
回复
谁说CSocket这个类有问题啊?我做的监控程序连续运行了几个月也还活着。
Flysnow 2001-12-31
  • 打赏
  • 举报
回复
保留一天,一天后给分,让更多的了解这一事实吧
Flysnow 2001-12-31
  • 打赏
  • 举报
回复
谢谢lifu(穷鬼)

看来要找其他方法了,给分
lifu 2001-12-31
  • 打赏
  • 举报
回复
如果你是实在是喜欢微软,建议阅读http://support.microsoft.com/default.aspx?scid=kb;en-us;Q185728 并下载mfcsocs.exe 这个历程也是做和你差不多的事。只是注意他使用了模块状态的有关知识。具体到此例就是说模块之间只能传递聚柄,所以他Detach后,在另一个线程Attach了。其他的都和你的这个差不多。
lifu 2001-12-31
  • 打赏
  • 举报
回复
就是说CArchive 和 CSocketFile 配合使用有时会不稳定,这是设计造成的,和你的程序无关。
建议你使用其它方法。不要再在这上面花时间了,连微软都建议避免这样使用。你的程序和历程几乎一样,不用在改了,你是对的,微软错了
lifu 2001-12-31
  • 打赏
  • 举报
回复
CArchive sometimes tries to maintain data in its buffer even if all of the data requested has been read. This causes an extra CSocketFile::Read call when no data is available on the socket file. The Read call hangs until more data appears or until the socket connection is closed.


Flysnow 2001-12-31
  • 打赏
  • 举报
回复
不可能满啊,才几百个字节啊

TO Julienjut(秋水)

AnsycSelect(FD_READ)用法怎么样
leonadoromario 2001-12-31
  • 打赏
  • 举报
回复
可能是缓冲区写满了
every 2001-12-31
  • 打赏
  • 举报
回复
赞同lifu(穷鬼) 
lifu 2001-12-31
  • 打赏
  • 举报
回复
不是csocket有问题,是是说CArchive 和 CSocketFile 配合使用有时会不稳定.
Julienjut 2001-12-30
  • 打赏
  • 举报
回复
你调用 AnsycSelect(FD_READ)函数了没有
Flysnow 2001-12-30
  • 打赏
  • 举报
回复
向上推
Flysnow 2001-12-30
  • 打赏
  • 举报
回复
端口肯定没问题,因为我通过“win2000的网络监视器”拦到的包,基本信息没什么不同IP和端口都正常,就是收不到

因为我原来是封装的类,通用于其他函数的调用,如果用API好像很难做好,所以请问有没有人以前遇到过这种现象,还是代码有什么问题?
kiko_lee 2001-12-30
  • 打赏
  • 举报
回复
如果不是很复杂的话建议不要用CSock的类,直接用API函数来最好了,据说这个类有点什么问题呢。

kiko_lee 2001-12-30
  • 打赏
  • 举报
回复
看看你的端口是否绑定错误了呢。
Flysnow 2001-12-30
  • 打赏
  • 举报
回复
贴子提前!OK?
Flysnow 2001-12-30
  • 打赏
  • 举报
回复
u p

高手,帮帮忙吧

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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