关于网络调用的问题

findcsdn 2009-06-06 03:29:09

我写得C/S程序,利用Socket在服务器和客户端之间传递数据(阻塞模式)。

假如服务器端定义了FunA,FunB,FunC等功能调用。

当调用FunB的时候出现异常,返回数据不正常,比正常情况下多发了数据到客户端,而客户端按照正常接受数据。

这时候如果调用FunC,就会出现错误,因为收到的是FunB遗留在Socket中的数据。

这以后的所有调用全部失败,通讯处于混乱状态。


请问如何才能避免一次调用错误导致后面的连环通讯错误。

另外,能不能谈一下,服务器和客户端之间的功能调用通常怎么写。


...全文
106 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeiying 2010-02-03
  • 打赏
  • 举报
回复
什么通信模型,不知道你写的网络什么样的服务,如果是聊天,游戏,下载,论坛的的话,那么星型结构,是最基本最有效的模型,在这个模型上,WOW的成功是最好的例子,这是最基本的,用星型结构你还可以做出常人很难想象的模型,比如无服务器模型,连锁机构并发式模型,一味的追求别人做过的东西,实在愚蠢,当然,你们没那么伟大开发自己的模型让后人使用,你们也不是c++之父
yeiying 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yanghehong 的回复:]
引用 13 楼 findcsdn 的回复:

有没有谁做过了,并且已经再使用了的通讯模型。


业界有不少比较成熟的RPC模型和实现,比如Sun做的unix上的 ONC RPC (它的协议可以看RFC 5531)


-千里孤行
[/Quote]
什么协议,那全是些无知的家伙搞出来的抄作,一个tcp/ip就够了,加上winsock2.0就是最基本的,你可以用他开发自己的协议,用的更方便,也用不多长时间,建议用win32 SDK开发,不要用控件,不要被别人控制,
看到中国的程序员,我真忍不住要吐了,怪不得中国的程序员都是窝囊废,什么都用别人的,自己都不动脑子
yeiying 2010-02-03
  • 打赏
  • 举报
回复
接收缓冲区的问题,你明白,混乱是你数据的接收问题,一个每个套接字都要对应一个独立的缓冲区,不要多个套接字对应一个缓冲区,这样永远不会错,我有个连接10万的服务器,用的完成例成,以24FPS的速度,进行语音和图片传速,都没问题,应为我的缓冲区 是独立的
findcsdn 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yanghehong 的回复:]
引用 13 楼 findcsdn 的回复:


有没有谁做过了,并且已经再使用了的通讯模型。


业界有不少比较成熟的RPC模型和实现,比如Sun做的unix上的 ONC RPC (它的协议可以看RFC 5531)


- 千里孤行
[/Quote]

谢谢!
yanghehong 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 findcsdn 的回复:]

有没有谁做过了,并且已经再使用了的通讯模型。
[/Quote]

业界有不少比较成熟的RPC模型和实现,比如Sun做的unix上的 ONC RPC (它的协议可以看RFC 5531)


- 千里孤行
findcsdn 2009-06-09
  • 打赏
  • 举报
回复

有没有谁做过了,并且已经再使用了的通讯模型。



xperson 2009-06-09
  • 打赏
  • 举报
回复
网络通信程序,首先要定义自己的数据交互协议。
一般的协议可以文本协议,以\r\n来表示一个请求和一个数据包终结。
如果是二进制协议,可以在每个数据包头部件上数据长度。
yanghehong 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hairetz 的回复:]

5楼,你看不到博文上标明的(转)字吗??
[/Quote]

hairetz,

不好意思,是我看错,对这博客系统不太熟悉 :)


- 千里孤行
yanghehong 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 findcsdn 的回复:]
对,我现在就是要实现一个比较稳定的rpc, 普通调用数据量小,可以用字节标注长度,然后接收。

但是,当查询报表的时候,数据量很大,我现在是每条查询记录发送一次,客户端接受一次;
问题是,现在担心数据量大了后,难保不出现错误。
就是想,怎么弄个有效机制,使错误只局限再本次调用中,发起下一次调用还是正常。 [/Quote]

这样啊,那你可以每次发 调用请求 都附带一个生成的transaction ID,这次调用返回的数据也要带上这个transaction ID,以表示是该次调用的数据。
下次的调用,由于你用另外一个transaction ID(比方说递增),那就把各次调用都区别开来了。


- 千里孤行
findcsdn 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mymtom 的回复:]
引用 6 楼 yanghehong 的回复:

引用 4 楼 blackbillow 的回复:
用rpc


似乎楼主现在的问题,就是自己怎样去实现RPC


- 千里孤行

一次把数据全部读出来,再处理,检测到数据错误,丢弃。

[/Quote]

对,我现在就是要实现一个比较稳定的rpc, 普通调用数据量小,可以用字节标注长度,然后接收。

但是,当查询报表的时候,数据量很大,我现在是每条查询记录发送一次,客户端接受一次;
问题是,现在担心数据量大了后,难保不出现错误。
就是想,怎么弄个有效机制,使错误只局限再本次调用中,发起下一次调用还是正常。


  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yanghehong 的回复:]
引用 2 楼 hairetz 的回复:
因为TCP传送的是数据流。

会出现第4条所说的状况

http://blog.csdn.net/hairetz/archive/2009/05/29/4223234.aspx

你的需求可以认为是粘包导致的。可以参考这篇。

http://www.cnblogs.com/wzd24/archive/2007/12/24/1011932.html



楼主说的问题似乎跟TCP层的粘包没什么关系;是说funcB压入多余数据给TCP层,是应用层错误 。

btw.另外,博客文章如果不是原创可能最好注明转…
[/Quote]

5楼,你看不到博文上标明的(转)字吗??
mymtom 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yanghehong 的回复:]
引用 4 楼 blackbillow 的回复:
用rpc



似乎楼主现在的问题,就是自己怎样去实现RPC


- 千里孤行
[/Quote]
一次把数据全部读出来,再处理,检测到数据错误,丢弃。
yanghehong 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 blackbillow 的回复:]
用rpc
[/Quote]

似乎楼主现在的问题,就是自己怎样去实现RPC


- 千里孤行
yanghehong 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
因为TCP传送的是数据流。

会出现第4条所说的状况

http://blog.csdn.net/hairetz/archive/2009/05/29/4223234.aspx

你的需求可以认为是粘包导致的。可以参考这篇。

http://www.cnblogs.com/wzd24/archive/2007/12/24/1011932.html
[/Quote]

楼主说的问题似乎跟TCP层的粘包没什么关系;是说funcB压入多余数据给TCP层,是应用层错误 。

btw.另外,博客文章如果不是原创可能最好注明转载或翻译:)


- 千里孤行
blackbillow 2009-06-06
  • 打赏
  • 举报
回复
用rpc
  • 打赏
  • 举报
回复
是第5条,打错了
  • 打赏
  • 举报
回复
因为TCP传送的是数据流。

会出现第4条所说的状况

http://blog.csdn.net/hairetz/archive/2009/05/29/4223234.aspx

你的需求可以认为是粘包导致的。可以参考这篇。

http://www.cnblogs.com/wzd24/archive/2007/12/24/1011932.html
yanghehong 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 findcsdn 的帖子:]

我写得C/S程序,利用Socket在服务器和客户端之间传递数据(阻塞模式)。

假如服务器端定义了FunA,FunB,FunC等功能调用。

当调用FunB的时候出现异常,返回数据不正常,比正常情况下多发了数据到客户端,而客户端按照正常接受数据。

这时候如果调用FunC,就会出现错误,因为收到的是FunB遗留在Socket中的数据。

这以后的所有调用全部失败,通讯处于混乱状态。


请问如何才能避免一次调用错误导致后面的连环…
[/Quote]
searchcsdn,

你当然不能想当然的期望 收到的数据依次是A,B,C.
你要让服务器发送过来的数据具有 自解释性,比方说,三串数据依次是:
1 | 10 |[10个字节的数据...]
2 | 15 |[15个字节的数据...]
3 | 17 |[17个字节的数据...]

这里,用1. 2 . 3分别给A,B,C编号,客户机收到之后,就知道接下来的是A,还是B,还是C的数据;
而第二部分(10 15 17),则表示长度,就说A的数据有10个字节,B有15个字节,C有17个字节。这样收完这些数量就知道完成,多余的乱的数据就自然丢弃,而不会引起混乱。

我只是就一般情况简单打个比方,你可以根据实际灵活发挥:)



- 千里孤行


23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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