Problem with socket

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Thomas Hervé

    Problem with socket

    My problem is not really python specific but as I do my implementation
    in python I hope someone here can help me.

    I have two programs that talk through a socket. Here is the code :

    <server>
    sock = socket.socket(s ocket.AF_INET, socket.SOCK_STR EAM)
    sock.setsockopt (socket.SOL_SOC KET, socket.SO_REUSE ADDR, 1)

    sock.settimeout (5.0)

    sock.bind(("", port)
    # We only handle one connection
    sock.listen(1)

    while 1:
    newsock, address = sock.accept()
    handle(newsock, address)

    def handle(sock, address) :
    print "Connection from", address
    dataReceived = newsock.recv(10 24)
    while 1:
    try:
    newsock.send(da ta)
    except socket.timeout, err:
    print "Connection timeout %s" % err
    break
    except socket.error, err:
    print "Connection broken %s" % err
    break

    </server>

    <client>
    sock = socket.socket(s ocket.AF_INET, socket.SOCK_STR EAM)
    sock.settimeout (5.0)
    sock.connect((h ost, port))
    sock.send("Gimm e a piece of information, please\r\n")

    while 1:
    r, w, e = select.select([s], [], [], 1.0)
    if r != []:
    handle_connecti on(s)


    def handle_connecti on(sock):
    try:
    response_data = sock.recv(1024)
    except socket.timeout:
    print "Socket timeout"
    return
    manage(response _data)

    </client>

    Ok I hope it's clear. My problem is that "select" only tests if there's
    data on the socket, and not the state of the socket. I want to be able
    to know if socket is "alive" or something like that. But I don't want
    to make "send" in the client (stay passive). Then, if I know that my
    socket is closed or my link down, I can try to reconnect periodically.

    I would rewrite the while in the client like that :
    <client>
    while 1:
    if not test_connect(s) :
    reconnect(s)
    # else continue normally
    r, w, e = select.select([s], [], [], 1.0)
    if r != []:
    handle_connecti on(s)
    </client

    My env: python2.3, linux/win32.

    Thanks in advance,

    --
    Thomas Herve <sorry for my english>
  • Donn Cave

    #2
    Re: Problem with socket

    In article <408f7917$0$270 16$626a14ce@new s.free.fr>,
    Thomas Herve <therve@neocles .com> wrote:
    ....[color=blue]
    > Ok I hope it's clear. My problem is that "select" only tests if there's
    > data on the socket, and not the state of the socket. I want to be able
    > to know if socket is "alive" or something like that. But I don't want
    > to make "send" in the client (stay passive). Then, if I know that my
    > socket is closed or my link down, I can try to reconnect periodically.[/color]

    Try a SO_KEEPALIVE option on the socket (setsockopt). That
    should (I would sort of expect anyway) raise an exception when
    the keepalive negotiation fails. The reaction won't be immediate,
    it may take hours to notice a dead connection.

    Donn Cave, donn@u.washingt on.edu

    Comment

    • Grant Edwards

      #3
      Re: Problem with socket

      On 2004-04-28, Thomas Hervé <therve@neocles .com> wrote:
      [color=blue]
      > Ok I hope it's clear. My problem is that "select" only tests
      > if there's data on the socket, and not the state of the
      > socket.[/color]

      That's not true. If the socket is closed, it will return from
      select as readable.
      [color=blue]
      > I want to be able to know if socket is "alive" or something
      > like that. But I don't want to make "send" in the client (stay
      > passive). Then, if I know that my socket is closed or my link
      > down, I can try to reconnect periodically.[/color]

      You'll know if the socket is closed because select will mark it
      as readable, and you'll get 0 bytes when you read it.

      If you want to know if the network or the other host has "gone
      away", set the SO_KEEPALIVE option on the socket. That will
      generate an error if the link is down. IIRC, it takes 75
      minutes (or is it 150?) to time out after the other end goes
      away.

      --
      Grant Edwards grante Yow! I wonder if there's
      at anything GOOD on tonight?
      visi.com

      Comment

      • Thomas Hervé

        #4
        Re: Problem with socket

        Grant Edwards wrote:[color=blue]
        > On 2004-04-28, Thomas Hervé <therve@neocles .com> wrote:
        >
        >[color=green]
        >>Ok I hope it's clear. My problem is that "select" only tests
        >>if there's data on the socket, and not the state of the
        >>socket.[/color]
        >
        > That's not true. If the socket is closed, it will return from
        > select as readable.[/color]

        Exact.
        [color=blue][color=green]
        >>I want to be able to know if socket is "alive" or something
        >>like that. But I don't want to make "send" in the client (stay
        >>passive). Then, if I know that my socket is closed or my link
        >>down, I can try to reconnect periodically.[/color]
        >
        > You'll know if the socket is closed because select will mark it
        > as readable, and you'll get 0 bytes when you read it.[/color]

        It seems that it's not true : when I read it I have a "Connection reset
        by peer" error.
        [color=blue]
        > If you want to know if the network or the other host has "gone
        > away", set the SO_KEEPALIVE option on the socket. That will
        > generate an error if the link is down. IIRC, it takes 75
        > minutes (or is it 150?) to time out after the other end goes
        > away.[/color]

        Yes, I've seen this option, but the delay is a bit too large (2 hours ?
        depending on OS it seems) and not configurable. So I made it by send
        some hearbeat regulary, even if I didn't want to I haven't found another
        way. And it's better for server side, from which I can make some recv
        that make the break found earlier.

        --
        Thomas Herve

        Comment

        Working...