Chinaunix

标题: 怎么建立socket长连接??? [打印本页]

作者: atg    时间: 2006-03-01 18:44
标题: 怎么建立socket长连接???
请问各位大虾, socket 编程是怎么建立长连接方试的
作者: atg    时间: 2006-03-01 19:12
怎么没人回?是不是我说得不清楚呀
作者: caojiqun    时间: 2006-03-01 19:20
原先还不清楚长连接是什么意思,刚才查了一下(http://www.chinaunix.net/jh/36/79863.html),才知道不断开的连接就是....
如果是这样,建立连接就不是关键所在了,只是保持连接时间的长短而已。
作者: atg    时间: 2006-03-01 19:26
那长连接与短连接 在编写代码时区别在那??
作者: caojiqun    时间: 2006-03-01 19:41
还是前面所说的,如果我对长短连接的概念理解没错的话,那么
长连接包括多次的读写过程,这期间不关闭连接(用一个循环就可实现);
短连接一次读写就结束(关闭连接),看到的大多数例子应该都可归于短连接。
作者: wolf0403    时间: 2006-03-01 20:02
譬如 HTTP 的 Connection-alive 如果为 close,则 server 收到一个 request 并发送完一个 response 之后就会主动关闭连接,这就是短连接;如果 Connection-alive keep-alive 的话可以在一个 tcp 连接中交换多次对话。是这个定义?那就只是个程序结构设计问题了。
作者: xiaonanln    时间: 2006-03-01 22:19
不就是标准的socket函数调用吗
作者: hkwang66    时间: 2006-03-01 23:35
长连接短连接只是一个概念性的问题,只要知道其概念,不是一个特殊的东西:
长连接:系统通讯连接建立后就一直保持。
短连接:只有系统需要相互发消息连接才建立(客户端发起),请求消息得到响应后连接关闭;
通讯实体间使用长连接,一般还需要定义心跳消息,定期发送来检测系统间链路是否异常,每隔一定时间发送一次心跳,如果一定次数没有收到心跳消息,这认为此连接出现问题,需要断开连接重新建立。
具体心跳消息的格式,以及发送间隔,以及多少次没有收到心跳就认为链路异常,以及数据部是否算作心跳消息(有的系统如果接收到数据包则会清除心跳计时器也就相当于系统中的数据包也算作心跳消息);这个需要两端进行协商。比如GSM常用的短消息中心和其他网络实体互连的SMPP协议,要求建立的就是长连接.

所以长短连接只是一个概念问题长短连接的socket,就是使用普通的socket函数,没有什么特殊的。

[ 本帖最后由 hkwang66 于 2006-3-2 00:58 编辑 ]
作者: atg    时间: 2006-03-02 20:00
用一个while 就能实现!  可是我要想在程序中只有一个调用 accet
多次接收发送应该怎么实现
作者: hkwang66    时间: 2006-03-03 00:39
标题: 回复 9楼 atg 的帖子
accept建立一个连接,都有一个文件句柄,这样读或写文件,就行了;
没有什么特殊的地方(可能就是,如果有多个连接需要把文件设置成
无阻赛方式,然后使用select进行轮询)。
(PS:是不是没有写过多个实体通讯的程序?)

[ 本帖最后由 hkwang66 于 2006-3-3 00:56 编辑 ]
作者: atg    时间: 2006-03-03 23:08
我以前没写过通迅程序!可现在公司要做所以才错手不及
作者: hkwang66    时间: 2006-03-05 01:18
其实电信行业也好,其他行业也好,和其他实体进行通讯主要的还是消息处理这一块;
通讯其实部分的编写其实紧紧占一小部分;封装一个Socket类把各种情况考虑进去一般也
不会超过1000行代码;大部分代码都在消息处理和程序框架组织这一块,可能刚开始写通讯程序
时都关注Socket这一块,其实通讯这块很快就能搞定,大部分工作量都在程序结构的安排和逻辑处理上
比如,多实体通讯时如果后来新增加一条消息或一种协议,你如何才能尽量少改动代码就能够快速的满足
需求这才是最关键的;不要新增条消息或一种协议把原来代码改动的面目全非,甚至连程序框架都发生变化。
作者: zhanglw    时间: 2006-03-06 13:35
原帖由 hkwang66 于 2006-3-5 01:18 发表
其实电信行业也好,其他行业也好,和其他实体进行通讯主要的还是消息处理这一块;
通讯其实部分的编写其实紧紧占一小部分;封装一个Socket类把各种情况考虑进去一般也
不会超过1000行代码;大部分代码都在消息处 ...

说得好,受益良多
作者: atg    时间: 2006-03-12 09:50
是呀! 别说实体! 过一些常见的我都很少写!
作者: dlms    时间: 2006-03-12 14:06
原帖由 xiaonanln 于 2006-3-1 22:19 发表
不就是标准的socket函数调用吗

还真不标准!
作者: atg    时间: 2006-04-07 22:13
现在都已经搞定了! 只要初始化一次就可以了! 在服务端/与客户端分别设定一个连接状态, 如果能与客
户端为连接状态就保连接, 否则就主动关闭与客户端连接, 在调用 accept 来实时监听客户端.
客户端的工作原理和服务端也是差不多的, 如果与服务器取得连接时就保持连接状态, 主动关闭与服务端连接
在调用 connect 来尝试与服务器连接! 就可以了!
作者: hkwang66    时间: 2006-04-08 02:19
一般来说长连接都要定义心跳消息的;客户端断开后主动重连并不能代表就是长连接;
为什么要定义心跳,其实还是为了检测链路是否正常的。
作者: atg    时间: 2006-04-11 12:19
原帖由 hkwang66 于 2006-4-8 02:19 发表
一般来说长连接都要定义心跳消息的;客户端断开后主动重连并不能代表就是长连接;
为什么要定义心跳,其实还是为了检测链路是否正常的。




那请问你是怎么样运用心跳完成长连接?
作者: cjaizss    时间: 2006-04-11 12:58
原帖由 atg 于 2006-3-1 19:26 发表
那长连接与短连接 在编写代码时区别在那??

http就是使用短连接最好的例子之一,
试图连接-》建立连接-》GET-》断开
完成了一个任务就立马断开,不用继续连接下去
作者: cjaizss    时间: 2006-04-11 13:03
原帖由 atg 于 2006-4-11 12:19 发表




那请问你是怎么样运用心跳完成长连接?

每隔一段时间发送心跳包,另外一端不断的收包,每当收到心跳包的时候,更新收到的时间,当发现一段时间没有收到心跳包的时候(比方可以在往对方发心跳包的时候检验),就知道连接出了问题,然后根据需要处理
作者: hkwang66    时间: 2006-04-12 00:42
原帖由 cjaizss 于 2006-4-11 13:03 发表

每隔一段时间发送心跳包,另外一端不断的收包,每当收到心跳包的时候,更新收到的时间,当发现一段时间没有收到心跳包的时候(比方可以在往对方发心跳包的时候检验),就知道连接出了问题,然后根据需要处理


我想说的cjaizss仁兄已经说了,心跳实现有多种多样的,需要客户端和服务端协商超时时间和重发次数,细节和实现有关西,比如定义了心跳,数据包是否也作为心跳处理(收到数据包需要清除超时定时器),两边协商好了按照做就可以了.
作者: atg    时间: 2006-04-12 21:43
这会全明白了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2