跪问一个网络传输中遇到非常郁闷的问题(很久都没能找到原因!!~~)
类别:VC阿里妈妈帮你实现网络赚钱梦
前段时间刚初学MFC网络编程,写一个局域网的多人聊天小程序。
可出现了个莫名其妙的问题。用CSocket建立连接。
服务器和各个客户端都能正常地连接。当传输数据的时候,问题出现了。(局域网,交换机连的)。
当网络中有“双核”(至少目前都是这样的)的机器时,在发送了一定数量的信息后,会出现无法收到和发送数据的现象.单核机之间怎么测都没问题.
如果是服务器,整个聊天系统都没反应了(设计的是所有消息发送都要经服务器中转);如果是客户端,那么这个客户端就无法收到信息也无法发送信息了。没采用多线程,没发生阻塞,客户端和服务器端表面上一切正常,按钮都能点。
开始还以为是多人聊天原因,改成双机直接用线对连,一个Server对一个Client。只要有“双核”计还是会出现这个问题。
一开始是用的先将信息用CArchive对象序列化,然后再用WriteString("******");写Buffer再Flush()发送,另一端用ReadString(**);接收后来以为是传输方法上有问题,改成用Send发送,将消息封装在一个Struct中发出去,另一端用Receive接收。均告失败!!但有一点不同,用Send能多发几个消息,也就是说用CArchive发不了几条消息就没反应了(有时甚至连建立了连接后的第一条消息都发不出去(程序里我发的是用户名)!!!用Send的话不会这么快出现问题,还能多发几条~~~.
有一次测试时,用一台单核机和双核机连接,那台双核机死都要作服务器,一当客户机就"罢工".~!!搞笑!!
请了个老师来解决,看了半天,郁闷.用etherea抓包,说能抓到数据包,能正常发送,他也不知道问题出在哪!~~在MSDN找了个老外写的用Send发送来聊天的实例,怎么都测不出问题,狂晕~!!
用到的机器有HP的机器(Intel双核的台机),Acer单双核笔记本,东芝双核笔记本,联保单核笔记本IBM单核笔记本.
这几天又碰到了这个问题,更郁闷,用路由器连的,用CArchive的方法发送发不了几条(一般是0条,也就是能建立连接但一条都发不出去也收不到).但用Send的方法时,不管是单核还是双核(笔记本),发了几百条消息,一点问题都没有?以前不知道为什么老出问题.
不知道到底是不是单双核的问题,但测出来实际确实如此.
这个问题困扰了我很久很久了,希望哪位大仙能帮忙解决下啊,本人在这里万分感激啊!!!!
问题点数:50、回复次数:4
1 楼ProgrameMan(我要学汇编)回复于 2006-12-02 16:55:33 得分 50
呵呵 怎么又见到有说双核了,你都说了 老外的程序怎么测都没问题,问题很明显了,好好看看你的程序吧,另外 CArchive 我没用过,没啥说话的权利,但是如果你就这么问估计没人能帮你解决了,除非以前遇到过这个问题并且已经解决了,你最好还是把代码贴出来吧
2 楼wilsonhuang(失落天子)回复于 2006-12-02 18:50:14 得分 0
CArcive方法发送和接收的主要代码(Server和Client端一样):
用CArcive发送:
ClientSoc为添加的CSocket类
void ClientSoc::SendMsg(CString temp)//temp为从Edit控件得到的文本
{
//AfxMessageBox(temp);
m_pArchiveOut->WriteString(_T(temp3 "\r\n"));
m_pArchiveOut->Flush();
}
用CArchive接受:
void ClientSoc::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
CString ss;
m_pArchiveIn->ReadString(ss);
//AfxMessageBox(ss);
mainptr->edit.SetWindowText(ss);//mainoptr为指向主窗体的指针,是建立好连接的时候传
//到这个类里面的
}
我试过,当出现问题后,不管另一端怎么发送,OnReceive没有被调用.
不好意思,我第一次发帖,不知道该怎么问,非常感谢你的回帖.
如果需要我稍后可以贴上所有代码,只不过有点长.
谢谢
3 楼wilsonhuang(失落天子)回复于 2006-12-03 00:18:10 得分 0
这是我写的第一个真正的应用程序,请各位高人帮帮忙吧.
消息发送的主要代码如下:
//ClientSoc.cpp
...
struct stream
{
char message[100];
};
...
//ClientSocDlg.cpp
void CClientSocketDlg::login()
{
const int LEN = sizeof(WORD) sizeof(stream);
char pBuf[LEN];
ASSERT(pBuf != NULL);
// 填充pBuf
*(WORD*)pBuf = 1;
stream *pLogin = (stream*)(pBuf sizeof(WORD));
strcpy(pLogin->text,text);//text是用户名CString型的输入的文本
c->Send((void*)pBuf, LEN, 0);
}
...
//lientSoc.cpp
void ClientSoc::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CSocket::OnReceive(nErrorCode);
WORD type;
if (Receive((void*)&type, sizeof(type), 0) != sizeof(type)) {
AfxMessageBox("unable to receive package type info.");
return;
}
switch (type)
{
case 1:
this->receivemessage();
break;
...
}
}
...
void ClientSoc::receivemessage()
{
stream info;
if (Receive((void*)&info, sizeof(info), 0) != sizeof(info))
{
TRACE0("unable to receive user login infomation.");
return;
}
CString rr= info.text;
ptr->edit.SetWindowText(rr);
}
...
这个程序在单机上测试和在单核机之间测试没测出过问题.实在不懂啊.
是不是硬件的原因或是缓存的问题么?
谢谢!
4 楼ProgrameMan(我要学汇编)回复于 2006-12-03 16:56:45 得分 0
这分受之有愧啊,你是否可以试着在 发送、接收的环节加上信号量来保证以下线程同步的问题呢,估计问题是出在线程同步的方面。
Ftp中的socket的连接问题
很菜的问题,OpenThread这个api的定义?
请问怎么设置聊天室系统(C/S)的多播IP地址。
关键字查询问题:SQL语句中使用LIKE时,关键字是"妇科,儿科"和"儿科,妇科"时,查询结果不一样,该怎样解决??
弹出菜单问题!请高手指教!
vc中关于listbox的使用
打开RC文件的问题
请问一个关于CDC的问题
模态对话框不能禁用非模态对话框的奇怪问题
怎样用CreateCompatibleBitmap()创建红色Bitmap
ini文件读取问题
如何在view类加按钮?
cpu和内存占有率控制,求救,谢谢各位大侠
vc调试状态循环执行 popfd和 add ebx,ebp
求助vc 中多线程的一个具体实现例子
关于CTreeCtrl的难题
在GDI 中如何对矢量图形进行放大缩小?
求教 win32API编程问题,关于windows 中的 setfocus()和WM_setfocus 疑问,谢谢大家了!
关于读图片到控件的问题
在VC6.0中逐语句调试时的问题