Plz help..SocketServer UDP server losing lots of packets

Steve Holden steve at holdenweb.com
Thu Nov 6 21:54:49 CET 2008


I D wrote:
> Hello James,
> Thanks for your response.
> But I cannot use a third party software, I need to use the exisiting
> API's within python.
> As I am new to python, I suspected that I should go by a simpler
> approach and so
> scrapped off the below code and wrote a very simple UDP server code as
> follows:
>  
> logFileName = '/home/msat/gsc/logs/' + compNum + '/logparsertracedump.log'
>         logfile = open(logFileName, "w")
>         from socket import *
>         host = "121.3.0.1 <http://121.3.0.1>"
>         port = PORT
>         buf = 4096
>         addr = (host,port)
>         # Create socket and bind to address
>         UDPSock = socket(AF_INET,SOCK_DGRAM)
>         UDPSock.setsockopt(SOL_SOCKET, SO_RCVBUF, 8388608)
>         UDPSock.bind(addr)
>         while 1:
>                 data,addr = UDPSock.recvfrom(buf)
>                 if not fileExists(logFileName):
>                         logfile = open(logFileName, "a")
>                 logfile.writelines(data)

It would make more sense to leave the file open outside the loop. If
it's important to have each packet individually logged you can call the
file's .flush() method after each .writelines() call. No need to
continually re-open it. I doubt this is the source of your packet loss,
however. Maybe there's a bug in fileExists (for which you could have
used os.path.exists, by the way).

>         # Close socket
>         UDPSock.close()
>  
How do you anticipate this line will ever be executed?

Your network code looks basically OK, though a little horrible with
things like 8388608 for the socket options. See if you get any ideas from

  http://holdenweb.com/docs/NetProg.pdf

though it doesn't tell you much you don't appear to know already.

regards
 Steve

> Even this seems to lose packets, I would really appreciate if any
> pointers can be provided to improve my code.
> 
> Thanks,
> Sam
>  
> On Wed, Nov 5, 2008 at 7:46 PM, James Mills
> <prologic at shortcircuit.net.au <mailto:prologic at shortcircuit.net.au>> wrote:
> 
>     On Thu, Nov 6, 2008 at 9:53 AM,  <id.engg at gmail.com
>     <mailto:id.engg at gmail.com>> wrote:
>     > logFileName = 'log.txt'
>     >        logfile = open(logFileName, "a")
>     >        class MyUDPServer(SocketServer.UDPServer):
>     >                def server_bind(self):
>     >                        self.socket.setsockopt(socket.SOL_SOCKET,
>     > socket.SO_RCVBUF, 8388608)
>     >                        self.socket.bind(self.server_address)
>     >
>     >        class LogsDumpHandler(SocketServer.DatagramRequestHandler):
>     >                def handle(self):
>     >                        global logfile
>     > # fileExists is a function which checks the existence of a file
>     >                        if not fileExists(logFileName):
>     >                                logfile = open(logFileName, "a")
>     >                        logfile.writelines(self.rfile.readlines())
>     >
>     >        server = MyUDPServer(("",PORT), LogsDumpHandler)
>     >        server.serve_forever()
>     >        logfile.close()
> 
>     This is horrible code :/
> 
>     Try these instead:
>      * UDPServer ->
>     http://trac.softcircuit.com.au/circuits/browser/examples/udpserver.py
>      * UDPClient  ->
>     http://trac.softcircuit.com.au/circuits/browser/examples/udpclient.py
> 
>     Example usage
>     ----------------------
> 
>     ~/circuits/examples
>     $ ./udpserver.py
>     127.0.0.1 <http://127.0.0.1/>, 9000:
>     test
>     127.0.0.1 <http://127.0.0.1/>, 9000:
>     hi
> 
>     ~/circuits/examples
>     $ ./udpclient.py -b 127.0.0.1:9000 <http://127.0.0.1:9000/>
>     127.0.0.1:8000 <http://127.0.0.1:8000/>
>     test
>     127.0.0.1 <http://127.0.0.1/>, 8000:
>     test
>     hi
>     127.0.0.1 <http://127.0.0.1/>, 8000:
>     hi
> 
>     You can download circuits from http://trac.softcircuit.com.au/circuits/
>     or get the latest development version by using Mercurial (1):
>     hg clone http://hg.softcircuit.com.au/projects/circuits/
> 
>     cheers
>     James
> 
>     [1] http://www.selenic.com/mercurial/wiki/
> 
>     --
>     --
>     -- "Problems are solved by method"
> 
> 
> 
> ------------------------------------------------------------------------
> 
> --
> http://mail.python.org/mailman/listinfo/python-list


-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC              http://www.holdenweb.com/




More information about the Python-list mailing list