我用DELPHI6 ,做一个TCP/IP主客户端程序(用TSERVERSOCKET/Tclentsocket),如何放弃了一个已建立的连接?

解决方案 »

  1.   

    请问,关于TCP/IP的编程,
    如果有很多客户端连接到服务器端,那么在服务端程序中我要如何主动关闭某一个socket套接字呢?
      

  2.   

    很简单呀,如果出现未知的原因中断,服务器检测不到客户端的连接中断时,可以采用询问,定时检测信号等等方式判断连接的有效性,如果确认连接无效,就可以调用close这是原始的方法(Delphi的也应该类似);大多数情况下,客户端的程序崩溃,主机崩溃,服务端程序都可以得到客户端的close信号的。
      

  3.   

    我把连接进来的GPRS ID 号写在控件listview1中。
    当客户端不可知中断后,下次再进来时,我只能根据它的GPRS ID 号来判断是否删除原来的记录,然后再把现在的记录写进去。可是如果只有一个GPRS ID 的时候,是没有问题的,一旦,多个ID 都进来时,删除掉不可知的SOCKET后,指令就发送不成功了。
      

  4.   

    请问:我做了个基于TCP/IP协议的程序,用控件:serversocket/clientsocket我把连接进来的GPRS ID 号写在控件listview1中,有3个以上的GPRS ID 。
    当客户端不可知中断后,下次再进来时,我只能根据它的GPRS ID 号来判断是否删除原来的记录,然后再把现在的记录写进去。可是如果只有一个GPRS ID 的时候,是没有问题的,一旦,多个ID 都进来时,删除掉listview1中现在不存在的GPRS ID 及相关的IP、SOCKET等,不可知的SOCKET后,指令就发送不成功了。
    这是为什么?
      

  5.   

    下面是一些错误信息。41836
    211.138.143.245
    2004-3-17 10:13:44
    错误事件是:An error occurred when trying to close a connection.
    -----------------------------------------------------------
    TCP/IP 连接发生错误!错误号为:10053
    44267
    211.138.143.249
    2004-3-17 10:13:38
    错误事件是:An error occurred when trying to close a connection.
    -----------------------------------------------------------
    TCP/IP 连接发生错误!错误号为:10053
    回复 ID=0000 的脉波帧命令!
    -----------------------------------------------------------
    1
    捕捉到来自 ID=0000 的脉波帧命令!5C 53 04 00 00 A2 24 79 
    -----------------------------------------------------------
    客户端登录 来自:211.138.143.249   句柄为:796   端口号:44267
    数目0
    -----------------------------------------------------------
    不可知中断原因的客户端已删除!
    -----------------------------------------------------------
    41969
    211.138.143.195
    2004-3-17 10:10:38
    错误事件是:An error occurred when trying to close a connection.
    -----------------------------------------------------------
    TCP/IP 连接发生错误!错误号为:10053
    回复 ID=0000 的脉波帧命令!
    -----------------------------------------------------------
    1
    捕捉到来自 ID=0000 的脉波帧命令!5C 53 04 00 00 A2 24 79 
    -----------------------------------------------------------
    来自IP:211.138.143.195   发回的数据包
    长度:26
    内容:5C 53 16 00 00 A1 FE 68 50 68 32 02 00 00 68 81 06 43 C3 83 93 34 33 C6 16 06 
    -----------------------------------------------------------
      

  6.   

    如果你的ListView中没有保存 Socket 而只是保存了一些数据,那删除不应该出现问题。尝试不要去删除,而是改写,看看问题是否依然存在。
      

  7.   

    我采用的是非阻塞方式。
    我想问的是:serversocket.socket.connection[i] 是由serversocket 自己来维护的吗?
    也就是说,I 的值是从0 到 正常连接的数目减1,对不对?还有,在server端我要如何主动
    释放一个socket连接,是不是 serversocket.socket.connections[i].close ; ?如果是的
    话,那我要如何把它和listview1.items.item 对应起来呢?
    还有,我在和其它GPRS 子站通信时,要如何换另一个SOCKET,是不是用:
    ServerSocket1.Socket.Connect(i);也就是先和另一个线程连接上后再进行通信?
    ServerSocket1.Socket.Connect(i).sendbuf();