|
|
View previous topic :: View next topic |
Author |
Message |
starkeeper
Joined: 06 Apr 2006 Posts: 9
|
How to detect TCP Disconnect? |
Posted: Thu Apr 06, 2006 3:50 am |
|
|
Hi,
I'm using the CCS/microchip TCP stack. I'm running a tcp-server on my microchip and I have a short test program on my PC.
The tool on my PC can connect to the PIC and send data, that works fine. But what if the client disconnects. Now the PIC should detect that the client has disconnected, but at the moment the PIC does not recognize any change. The socket state remains in TCP_EST.
How can I find out if the client is still connected? The Socket should disconnect and change to TCP_listen.
greets starkeeper |
|
|
Douglas Kennedy
Joined: 07 Sep 2003 Posts: 755 Location: Florida
|
|
Posted: Thu Apr 06, 2006 6:53 am |
|
|
Search the web for the TCP rfc and specs. There is a three part handshake. Now if the virtual circuit is dropped as opposed to logically terminated then since TCP is inherentently asynchronous you will most likely need a timeout to be triggered if a packet isn't received within a specified time. |
|
|
starkeeper
Joined: 06 Apr 2006 Posts: 9
|
|
Posted: Thu Apr 06, 2006 8:06 am |
|
|
Douglas Kennedy wrote: | Search the web for the TCP rfc and specs. There is a three part handshake. Now if the virtual circuit is dropped as opposed to logically terminated then since TCP is inherentently asynchronous you will most likely need a timeout to be triggered if a packet isn't received within a specified time. |
OK, I just was not sure if the Stack already does this for me or not. Thanks for your advice. |
|
|
hanxuallan Guest
|
|
Posted: Thu Apr 06, 2006 7:57 pm |
|
|
This is PC software job, you do not need consider.
What I do is that:
PC send a specific char to PIC per min (or second).
PIC receive the char and means PC is alive. |
|
|
captwiggum Guest
|
|
Posted: Mon Apr 27, 2009 5:20 pm |
|
|
Code: | """
tcp_disconnect.py
Echo network data test program in python. This program easily translates to C & Java.
By TCP rules, the only way for a server program to know if a client has disconnected,
is to try to read from the socket. Specifically, if select() says there is data, but
recv() returns 0 bytes of data, then this implies the client has disconnected.
But a server program might want to confirm that a tcp client is still connected without
reading data. For example, before it performs some task or sends data to the client.
This program will demonstrate how to detect a TCP client disconnect without reading data.
The method to do this:
1) select on socket as poll (no wait)
2) if no recv data waiting, then client still connected
3) if recv data waiting, the read one char using PEEK flag
4) if PEEK data len=0, then client has disconnected, otherwise its connected.
Note, the peek flag will read data without removing it from tcp queue.
To see it in action: 0) run this program on one computer 1) from another computer,
connect via telnet port 12345, 2) type a line of data 3) wait to see it echo,
4) type another line, 5) disconnect quickly, 6) watch the program will detect the
disconnect and exit.
I hope this is helpful to someone. John Masinter, 17-Dec-2008.
"""
import socket
import time
import select
HOST = '' # all local interfaces
PORT = 12345 # port to listen
# listen for new TCP connections
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(1)
# accept new conneciton
conn, addr = s.accept()
print 'Connected by', addr
# loop reading/echoing, until client disconnects
try:
conn.send("Send me data, and I will echo it back after a short delay.\n")
while 1:
data = conn.recv(1024) # recv all data queued
if not data: break # client disconnected
time.sleep(3) # simulate time consuming work
# below will detect if client disconnects during sleep
r, w, e = select.select([conn], [], [], 0) # more data waiting?
print "select: r=%s w=%s e=%s" % (r,w,e) # debug output to command line
if r: # yes, data avail to read.
t = conn.recv(1024, socket.MSG_PEEK) # read without remove from queue
print "peek: len=%d, data=%s" % (len(t),t) # debug output
if len(t)==0: # length of data peeked 0?
print "Client disconnected." # client disconnected
break # quit program
conn.send("-->"+data) # echo only if still connected
finally:
conn.close()
|
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|