我用D6的tserversocket / tclientsocket 控件,servertype采用:stNonBlocking ,做一个TCP/IP的通信软件

  • 主题发起人 主题发起人 solonet
  • 开始时间 开始时间
S

solonet

Unregistered / Unconfirmed
GUEST, unregistred user!
我用D6的tserversocket / tclientsocket 控件,servertype采用:stNonBlocking ,做一个TCP/IP的通信软件。(50分)<br />我用D6的tserversocket / tclientsocket 控件,servertype采用:stNonBlocking ,做一个TCP/IP的通信软件。

我的客户端是n个GPRS 终端,所以不用管它。可是,终端它可能有不可知的中断,比如突然断电等情况,所以这里就有一个问题:当终端不可知的中断的情况下,主站是肯定不知道的,而且,socket 连接的数组也不会减少的,也就是中断的SOCKET 套接字不能及时的删除,那么主站它会定时下达指令时,也会向这个已中断的SOCKET发指令,所以这时发送的指令是无法返回的。请问我要如何维护SOCKET 的CONNECTION[K],就是要删除数组中的某个数;

serversocket.socket.connection[k].close;
以上这句是用来关闭一个连接,但不是用来删除数组中的一个数;


************************

//统计在线的终端数:
statusbar1.Panels.Items[5].Text:= inttostr(serversocket1.socket.activeconnections);


用以上这句可以统计在线有套接字数,也就是有多少可用的SOCKET,但问题是假设目前我只有3个测试点,可能是中断后再登录上来,所以统计出来有5或者更多个。请问我要怎么正确维护socket的connection 的数组啊?
也就是我有几个终端,就应该有几个SOCKET。

***********************

我还用ListView1,来记录当前登录的终端,ListView1记录有如下几个项目:
序号、GPRS ID 号、终端IP 地址、端口号



var
newitem:tlistitem;
-----------------------------

//登录的子站
newitem:=listview1.Items.Insert(listview1.Items.Count); //插入的位置;
newitem.Caption:=inttostr(listview1.Items.Count-1);
newitem.SubItems.Add(gprsid);
newitem.SubItems.Add(socket.RemoteAddress);
newitem.SubItems.Add(inttostr(socket.RemotePort));



请问我要如何才能保证有效的SOCKET与LISTVIEW1中记录的一致?这样才能正确通信。



谢谢!


对了,我的网名叫:solonet

qq:28972303

email:solonet@163.net
 
关键两点:
1,CONNECTION[K] 不是静态数组,它大小是随SOCKET在变化的,它是一个LIST.
不能通过序号,而是要通过IP和PORT来定位指定客户SOCKET,对吗?

2,serversocket.socket.connection[k].close;会自动释放对象,并将
对象从LIST中删掉,而且connection[k]也会减少的,对不对?
 
冥思苦想两天,已经解决所有问题了。

虽然没有人帮我,但我认为DFW 的朋友还是很热情的。
 
楼主,我也碰到此问题,给我答案好吗?
QQ:290356739
email: hej@liugong.com
 
楼主,我也碰到类似问题,求助~
qq:1737284
email: snakezhao@sina.com
 
//用列表中的IP和端口分别与线程中的IP和端口相比较,如果IP相等,端口不相等,则说明此线程已断开,应释放;
 
最近还是有很多人在问这个问题啊。
希望大家好运。
 
后退
顶部