Socket Blocking problem

sree skodela at btinternet.com
Fri Jan 3 11:04:28 CET 2003


Hi guys

I am writing a small socket program in python. Here there are two progs. One
sits on system A and accepts connections, does something with the data that
came in. Othe sits on system B and sends commands to system A. Problem is I
want to be able to read if system A is busy or free from system B. Hence I
tried setblocking(0) but then it fails to start with error as below on
system A.

     Traceback (most recent call last):
     File "periph.py", line 39, in ?
     (con,addr)=s.accept()
     socket.error: (11, 'Resource temporarily unavailable')

Then I tried with no setblocking in system A and setblocking(0) on System B.
It connects but fails on command as below.

    master.py desk 2670
   ['master.py', 'desk', '2670']
   READ HELO
   Traceback (most recent call last):
   File "master.py", line 17, in ?
   s=conn()
   File "master.py", line 12, in conn
   s.connect((sys.argv[1],port))
   socket.error: (115, 'Operation now in progress')

If I don't use setblocking it works fine except when I want to send 'READ
HELO' to check if the system is available it waits until system is free.

What I want is to try 'READ HELO' and decide if system is free. If not do
something else.

code for System A is here :
usage : python system-a.py 2675 
#########################################################################
from socket import *
import os,string,sys
global res,status
res=0
status=0

port=int(sys.argv[1])
s=socket(AF_INET,SOCK_STREAM)
#s.setblocking(0)
s.bind((gethostname(),port))
s.listen(5)

def pex(cmd):
    global status
    f=os.system(cmd)
    if f==0:
        return "SUCC"
    else:
        return "FAIL"
    
def process(con,cmd):
    global res,status
    if cmd=="QUIT":
        con.close()
        raise SystemExit
    elif cmd=="HELO":
        con.send("HELO")
        return
    elif string.find(cmd,"EXEC")>=0:
        cmd=cmd[string.index(cmd,'EXEC')+len('EXEC')+1:]
        status='BUSY'
        res=pex(cmd)
        status='FREE'
        return
    elif cmd=="STAT":
        con.send(res+'-'+status)
        return
while 1:
    (con,addr)=s.accept()
    cmd=con.recv(1024)
    process(con,cmd)
    
###########################################################

code for system B is here
usage: python system-b.py 192.168.122.2 2675
-----------------------------------------------------------
from socket import *
import os,sys,string

global s
s=0
print sys.argv
port=int(sys.argv[2])

def conn():
    s=socket(AF_INET,SOCK_STREAM)
    s.setblocking(0)
    s.connect((sys.argv[1],port))
    return s

while 1:
    cmd=string.strip(raw_input())
    s=conn()
    if string.find(cmd,"EXEC")>=0:
        s.send(cmd)
    elif string.find(cmd,"READ")>=0:
        s.send(cmd[string.index(cmd,'READ')+len('READ')+1:])
        print s.recv(1024)
    else:
        s.send(cmd)
    s.close()
-----------------------------------------------------------

Any help would be greatly appreciated.

Cheerio
sreekant




More information about the Python-list mailing list