标题:如何让用CSocket和CSocketFile以及CArchive三个类开发的服务器端和用WinSoc ...
只看楼主
游戏使者
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2005-8-24
 问题点数:0 回复次数:6 
如何让用CSocket和CSocketFile以及CArchive三个类开发的服务器端和用WinSocket开发
在VC平台上,为什么我用CSocket类和CSocketFile以及CArchive三个类(它们之间进行关联)开发的服务器端只能和用这三个类开发的客户端通信,不能和用Winsock开发的客户端通信呢?
具体情况是:我是用上述的三个类写好服务器端。而工程组的另一些人用WinSocket写的客户端,开发成功后对接时我发现:“服务器端发给客户端的消息客户端可以正常的接收,而客户端向服务器端发送的消息时服务器端就会出现假死的现象,根本处理不了。”
我又用其它的软件测试了一下,凡是不是用上述三个类写的客户端发送的消息服务器端均处理不了。
也就是当使用用CSocket类和CSocketFile以及CArchive三个类写的程序和用WinSocket写的程序进行通信时,用这三个类写的程序只能发送消息,根本无法接收消息,一旦接收了就会出现假死的现象,无法处理。
如何才能把这个问题解觉掉呢?十万火急,求大侠们解觉呀。

下面我把一些关于用这三个类和用API写的程序分别传上来,供大家分析指导。。
程序解压后有两个包,这两个包中的程序都是即可以做服务器又可以做客户的,但是当这两个包中的程序一个做服务器而另一个做客户时就无法正常通信了。
Hnyw1RPp.rar (75.46 KB) 如何让用CSocket和CSocketFile以及CArchive三个类开发的服务器端和用WinSocket开发的客户端正常


[此贴子已经被作者于2006-7-29 13:37:38编辑过]

搜索更多相关主题的帖子: 服务器 CArchive CSocketFile WinSocket 开发 
2006-07-28 22:25
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 
因为CArchive在实现<<时,会读取头一个或者多个字节(如果头一个字节是0XFF,则读取两个字节作为长度,如果头两个字节是0xffff,则读取四个字节作为长度)作为整个流的长度,由于你用winsocket时传送的缓冲内容是你自己定的,所以两边发送和读取的格式会不一致,最后导致读取失败(如果CArchive端发送字符串,你会发现用winsocket的客户端会在第一个字节处收到一个不是字母值的数值,那就是CArchive填充的缓冲长度了)
所以你要么在用winsocket实现的程序中严格按照CArchive定义的格式进行缓冲填充,要么用CSocket类时不要用CArchive

最后说一下,我周末一般不上论坛,所以你发消息给我也没用......

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-07-31 10:37
游戏使者
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2005-8-24
得分:0 
以下是引用aogun在2006-7-31 10:37:37的发言:
因为CArchive在实现<<时,会读取头一个或者多个字节(如果头一个字节是0XFF,则读取两个字节作为长度,如果头两个字节是0xffff,则读取四个字节作为长度)作为整个流的长度,由于你用winsocket时传送的缓冲内容是你自己定的,所以两边发送和读取的格式会不一致,最后导致读取失败(如果CArchive端发送字符串,你会发现用winsocket的客户端会在第一个字节处收到一个不是字母值的数值,那就是CArchive填充的缓冲长度了)
所以你要么在用winsocket实现的程序中严格按照CArchive定义的格式进行缓冲填充,要么用CSocket类时不要用CArchive

最后说一下,我周末一般不上论坛,所以你发消息给我也没用......

谢谢您。版主
我试过了,服务器端给用winSock写的客户端通信时确实有不明字符存在,并且会随发送的字符多少不同而出现的形式也不一样,
但我用客户端回复时加了oxffff也无济于事呀,能具体一点不?即然是表示长度的,它在传送过程中也是传送的oxff吗?
还有,能把具体表示长度所用的标识规则讲一下吗?谢谢了。不是每多两个字节就多两个ff吧?



比如客户端发送 oxff人
或oxffff人民
时服务器端还是无法处理呀

[此贴子已经被作者于2006-7-31 15:24:17编辑过]


写程序像做爱一样,质量的好坏完全取决于心情……
2006-07-31 15:15
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 
读取规则你可以看MFC的代码,那里面写得很清楚,规则我上面也说过了,你理解错了
首先读取一个字节,如果这一个字节是0XFF,则读取两个字节作为长度,如果这两个字节是0xffff,则读取四个字节作为长度,也即是说,如果读取的第一个字节不是0xff,则认为这次传输的缓冲长度为这个字节的数值大小,否则按照上面的规定如此类推

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-07-31 16:14
游戏使者
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2005-8-24
得分:0 
我试了一下你说的办法,但一直还是没有成功,在客户端加入字符长度的格式可能不对也不知怎么的,反正一直没有成功。我在客户端所加的代码如下 :比如要发送"uuu"这三个字符,则加入了这样的代码CString str1 = _T("uuu");
CString str2=_T("");
str2.Format("%c",'\x03');
str1.Insert(0,str2);
但有时还老是出错。。。情况紧急,望版主帮一下忙http://www.bc-cn.net/bbs/dispbbs.asp?boardid=55&id=80836&star=10#240713

写程序像做爱一样,质量的好坏完全取决于心情……
2006-08-03 12:25
游戏使者
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2005-8-24
得分:0 
谢谢以上各位朋友的支持。

在紧迫的时间要求下,今中午问题已解觉。呵呵,还是给一点压力来得好些。现把解觉办法与大家分享如下:

其实过程相当简单,只要把服务器端稍微改动一下就OK了。但归功还要多谢版主(aogun)了的提示。
打开服务器端可以发现在发送和接收时它都用了一个串行化读写的过程
<< 和 >> 问题就出在这里了。就在这个过程中要求的有长度选项。那么怎么办才能把它替换掉呢?用ReadString(CString xxxx) 和WriteString(CString xxx)来替换问题即可解觉。

最后再次感谢版主在百忙之中替咱解觉问题。

写程序像做爱一样,质量的好坏完全取决于心情……
2006-08-03 14:33
northwolf521
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-11-28
得分:0 
3434
2008-11-28 04:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-80836-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.424900 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved