[Tutor] Network programming

Johan Geldenhuys johan at accesstel.co.za
Mon Sep 13 09:48:57 CEST 2004


Thanks Kent,

I will look at my loop and at the links you gave. My links stays up, but
as you noticed, I must get away of sending the data received from either
connections. Will I be able to use the select.select for this. There are
three file desriptors in this. One for incoming, one for outgoing and
the other for errors. Can I use the outgoing one to send the data the
incoming list received?

Thanks

Johan

On Fri, 2004-09-10 at 03:44, Kent Johnson wrote:

> Johan,
> 
> It looks to me like your program will get stuck in the inner while loop. 
> There is no way inside this loop to get a new value for indata or outdata.
> 
> There are two approaches you could use to solve your problem - either put 
> the two sides of the transfer into separate threads, or use some kind of 
> polling to look for data available on either socket.
> 
> The thread approach usually uses three threads:
> - a master thread that listens to the server socket and accepts the 
> incoming connection. It then opens the forwarding socket and spawns two 
> forwarding threads.
> - the forwarding threads read from one socket and write to another. They 
> are symmetric - one thread reads from socket A and writes to socket B; the 
> other thread reads from socket B and writes to socket A.
> 
> Each thread uses blocking I/O - the master thread blocks on 
> socket.accept(); the forwarding threads block on socket.recv().
> 
> A simple example that uses the treaded approach to do something similar to 
> what you want to do is here: 
> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/114642
> In this case the Pinhole class is the master thread; when it gets a 
> connection it creates two PipeThreads to do the reading and writing.
> 
> 
> The polling approach uses non-blocking I/O. In it's crudest form its loop 
> looks like this:
> forever:
>    if data available on socket A:
>      read from socket A
>      write to socket B
>    if data available on socket B:
>      read from socket B
>      write to socket A
>    sleep for a bit
> 
> This is crude because it is either unresponsive (if the sleep is long) or 
> wasteful of CPU (if the sleep is short and there is not much to do). It 
> might be fine for a simple use with just one connection, though.
> 
> The Python asyncore and asynchat modules use a more sophisticated version 
> of this; instead of sleeping, they use a system call that blocks until 
> there is activity on any of the sockets it is watching. This is very 
> efficient, as the polling loop only wakes up when there is something for it 
> to do. Medusa <http://www.nightmare.com/medusa/index.html> and Twisted 
> <http://www.twistedmatrix.com/> are two servers that are based on this 
> approach. It can be more efficient for large numbers of connections because 
> it doesn't have to create a thread for each one.
> 
> asyncore and asynchat hide the actual polling loop from you. You interact 
> with them by defining callback methods that get called when data is 
> available or when a channel is available for writing. This tutorial is a 
> good introduction to this approach. The proxy server at the end is similar 
> to what you are trying to do. http://www.nightmare.com/medusa/programming.html
> 
> Medusa includes a chat server which is also similar to your application.
> 
> I hope this helps get you on the right track!
> Kent
> 
> At 10:14 AM 9/9/2004 +0200, Johan Geldenhuys wrote:
> >I still have trouble when I want to send data out as soon as it comes in 
> >from one side.
> >My server listens and accepts the calls and then builds the client 
> >connection to the destination. Please see if you can assist.
> >
> >Thanks
> >
> >Johan
> >####################################################
> >
> ># we have an incoming socket connect
> >                     newConn, addr = self._serverSocket.accept()
> >                     self.log('Connection received from: %s:%s' % addr)
> >
> >                  #while connection is active on server:
> >                  while 1:
> >                             #self._ne1_id = '1234'
> >                             #self._ne2_id = '1111'
> >
> >                             indata = newConn.recv(8192)
> >                             self.log('First Data received from LCT:' + 
> > `indata`)
> >
> >                             if '\xff' in indata:
> >                              continue
> >
> >                           if '\x01' in indata:
> >                              continue
> >
> >                            #Look for string of 1234 in indata:
> >                              if indata[0:4] == self._ne1_id:
> >                                 self.log('indata 0:4 is:' + `indata[0:4]`)
> >                                 self.sock = socket(AF_INET, SOCK_STREAM)
> >
> >                             #connect to this destination if the string is 
> > 1234
> >                             self.sock.connect((self._ne1_ip, 
> > self._ne1_port)) # This is previously defined
> >                                self.log('Connection established to NE1: 
> > %s:%i' % (self._ne1_ip, self._ne1_port))
> >                                outdata = self.sock.recv(8192)
> >                                #when connection to destination is up:
> >                             while 1:
> >                                    if indata:
> >                                    self.sock.send(indata)
> >                                     self.log('indata send to NE, line 
> > 106: ' + `indata`)
> >
> >                                   # If break sequence is received from 
> > server side, close the client connection
> >                                        if '\x11' in indata:
> >                                      self.log('Break character received')
> >                                      break
> >                                        self.sock.close()
> >                                     self.log('connection to NE1 now closed')
> >
> >                                    if oudata:
> >                                       newConn.send(outdata)
> >                                       self.log('Data from NE:' + `outdata`)
> >###########################################################
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >On Tue, 2004-09-07 at 14:58, Kent Johnson wrote:
> >>
> >>
> >>We might be better able to help if you post your code.
> >>
> >>Here is a list of HTTP proxy servers written in Python, you might find
> >>something helpful there:
> >><http://xhaus.com/alan/python/proxies.html>http://xhaus.com/alan/python/proxies.html
> >>
> >>Kent
> >>
> >>At 02:19 PM 9/6/2004 +0200, Johan Geldenhuys wrote:
> >> >Hi,
> >> >
> >> >I am new to Python and would like to know more about network programming
> >> >in particilar.
> >> >
> >> >I have a script that sets up a socket server and must wait for incoming
> >> >connections. Once a call has been accepted, it must make another socket
> >> >connection to a destination.
> >> >
> >> >Now, I want to let these two "talk" to each other. Once the server
> >> >receives data it must be send out to the destination and when the
> >> >destination has data, it must be send out to the connection that made the
> >> >first call to the server.
> >> >
> >> >Does anybody have any examples or tips on how I can let this happen. My
> >> >calls work for the first batch of data and then when new data is received,
> >> >the calls break.
> >> >
> >> >Thanks
> >> >
> >> >--
> >> >        Johan Geldenhuys
> >> >Access Telecommunication Systems
> >> >  Mail to: johan at accesstel.co.za
> >> >--
> >> >This message has been scanned for viruses and
> >> >dangerous content by 
> >> <<http://www.azitech.co.za>http://www.azitech.co.za>Azitech, and is
> >> >believed to be clean.
> >> >_______________________________________________
> >> >Tutor maillist  -  Tutor at python.org
> >> ><http://mail.python.org/mailman/listinfo/tutor>http://mail.python.org/ma
> >> ilman/listinfo/tutor
> >
> >
> >
> >
> >
> >--
> >        Johan Geldenhuys
> >Access Telecommunication Systems
> >  Mail to: johan at accesstel.co.za
> >
> >--
> >This message has been scanned for viruses and
> >dangerous content by <http://www.azitech.co.za>Azitech, and is
> >believed to be clean.
> 
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor

-- 
       Johan Geldenhuys
Access Telecommunication Systems
 Mail to: johan at accesstel.co.za

-- 
This message has been scanned for viruses and
dangerous content by Azitech, and is
believed to be clean.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20040913/b95aaba7/attachment.html


More information about the Tutor mailing list