UDP client-server problem

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • WIWA

    UDP client-server problem

    Hi,

    I want to make a UDP client server application that is conform to
    RFC868 (Time protocol). Both the UDP client and UDP server are in a
    test phase.

    The question is: when I add "svrsocket.send to(resultaat, (ip, port))"
    in the UDP server, my application closes while running. When I leave
    it away, it works fine. I really need this statement as the purpose is
    that a client sends sth to the server and the server sends back the
    time ticks.

    Anybody an idea how I can modifu my client/server so that it works?

    Regards,

    Wim


    Here is the server:

    # UDP server example
    import time
    import socket
    import string
    import string

    class Tijd:
    def __init__(self, hours=0,minutes =0,seconds=0):
    self.hours=hour s
    self.minutes=mi nutes
    self.seconds=se conds

    def aantal_seconden (self):
    x = time.time()
    y=(1970, 1, 1, 1, 0, 0, 0, 0, 0)
    y=time.mktime(y )
    resultaat=x-y
    return resultaat

    if __name__=="__ma in__":
    tijd=Tijd()
    resultaat=tijd. aantal_seconden ()
    print 'resultaat',res ultaat

    port=37

    svrsocket = socket.socket(s ocket.AF_INET, socket.SOCK_DGR AM)
    svrsocket.bind( ('', port))

    hostname = socket.gethostn ame()
    ip = socket.gethostb yname(hostname)
    print 'TOD server is at IP adress: ', ip

    tijd=time.ctime ()
    tijd=string.spl it(time.ctime() )
    print 'The current time is', tijd[3]
    print 'Listening for TOD-requests on port %s ...' %port

    while 1:
    data, address = svrsocket.recvf rom(256)
    print 'Received a TOD-request from modem with IP-address %s'
    %address[0]
    print 'Sending back the time to modem with
    IP-address',addres s[0]
    print "time", resultaat
    svrsocket.sendt o(resultaat, (ip, port))


    And here is the client:

    # UDP client example
    import socket
    port=37
    clisocket = socket.socket(s ocket.AF_INET, socket.SOCK_DGR AM)
    while 1:
    data = raw_input("Type something: ")
    if data:
    clisocket.sendt o(data, ("127.0.0.1" , port))
    else:

    break
    s.close()
  • Irmen de Jong

    #2
    Re: UDP client-server problem

    WIWA wrote:
    [color=blue]
    > The question is: when I add "svrsocket.send to(resultaat, (ip, port))"
    > in the UDP server, my application closes while running. When I leave
    > it away, it works fine. I really need this statement as the purpose is
    > that a client sends sth to the server and the server sends back the
    > time ticks.[/color]

    It would have helped if you were more specific about: "closes while running"?
    In my case (running your code) I get an exception in the server:


    Traceback (most recent call last):
    File "server.py" , line 44, in ?
    svrsocket.sendt o(resultaat, (ip, port))
    File "<string>", line 1, in sendto
    TypeError: sendto() takes exactly 3 arguments (2 given)


    this pretty much tells you what's wrong. Your sendto() call is faulty.

    The first argument in your case is of type <float> while it should be
    a <string>. So try

    svrsocket.sendt o(str(resultaat ), (ip, port))

    however, this triggers a loop in your code if your client is on the
    same machine as the server (the server sends out a UDP packet to the
    same port as it itself is listening on, on my machine, it gets back
    its own UDP packet....)

    HTH,
    --Irmen de Jong



    Comment

    • Heiko Wundram

      #3
      Re: UDP client-server problem

      This should work:

      Server
      ======

      import socket
      import time

      # Constants.
      PORT = 37

      # Create and bind the socket which listens for packets.
      srvsocket = socket.socket(s ocket.AF_INET,s ocket.SOCK_DGRA M)
      svrsocket.bind( ('',PORT))

      while 1:
      # Block waiting for packet.
      data, address = svrsocket.recvf rom(256)
      print "Client sent:", data
      print "Client at:", address
      # Got a packet, reply to address packet came from.
      srvsocket.sendt o(str(time.time ()),address)

      Client
      ======

      import socket

      # Constants.
      PORT = 37

      # Create new socket, let it bind to an OS-chosen port.
      clisocket = socket.socket(s ocket.AF_INET,s ocket.SOCK_DGRA M)

      while 1:
      data = raw_input("Ente r what the server receives.")
      if data:
      # Send data to server, irrelevant what.
      clisocket.sendt o(data,("localh ost",PORT))
      # Block waiting for reply.
      data, address = clisocket.recvf rom(256)
      print "Server sent time:", data
      else:
      break

      Look at the above code. There were several errors in your original
      implementation, e.g. that time never got updated while the server ran,
      and several other things. I also don't see the need for a Tijd class.

      HTH!

      Heiko.

      PS: The above code is untested, if there's something wrong, my bad... :)
      PPS: Read the UNIX TCP/IP Network Programming FAQ if you're into socket
      programming! Google for it, I currently don't know the URL...


      Comment

      Working...