user580687
user580687

Reputation: 1

Sockets, communication stops

I have a simple question about socket programming. I've done to implement a server and two clients as following codes, but all of sudden it stops while it communicates each other. I have no idea why it happens all the time.

Would you give me advice, hint, or help?
Thank you for your time.

Client

# simple client

import socket
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = ""
port = 12345

buf = 100

s.connect((host, port))
i = 0

timestep = 0

while(1):
    k = '01'#+str(timestep)
    #1
    s.send(k)
    print 'sending message is', k

    #2
    v = s.recv(buf)
    print v

    if v == 'hold 01':
        print 'timestep is', timestep#'send the previous message'
        if timestep == 0:
            timestep == 0
        else:
            timestep -= 1
    else:
        print 'read data'
        FILE = open("datainfo1.txt", "r+")
        msg = FILE.read()
        FILE.close()

        #3
        while(1):
            tmp, msg = msg[:buf], msg[buf:]

            s.send(tmp)

            print len(tmp)

            if len(tmp) < buf:
                print 'break'
                break
        # send file
    i+=1
    timestep+=1
print 'end'
s.close()

Server

import socket, sys 

# set up listening socket 
lstn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = ""
port = 12345

# bind lstn socket to this port 
lstn.bind(("", port)) 
lstn.listen(5) 

# initialize buffer size
buf = 100

# initialize concatenate string, v 
v = ''

# initialize client socket list 
cs = [] 
check = [0, 0]

# a fixed number of clients
nc = 1 

count = 0
status = [0,0]
j = 0
step = [0,0]

for i in range(nc): 
    (clnt,ap) = lstn.accept() 
    clnt.setblocking(0) 
    cs.append(clnt) 


file = open("output_analysis.txt","w+")

while (len(cs) > 0): 
    clnt = cs.pop(0) 
    cs.append(clnt) 

    try: 
        #1
        k = clnt.recv(buf)  
        print "k=",k,"\n"#[:2]  
        if k == '01':
            print "1st client connected", status[0]
            file.write("1st\t") 

            if status[0] == 0:
                v = 'hold 01'
                check[0] = 1
            elif status[0] == 1:
                v = 'go 01'
                # status[0] = 0

            print v, "the message\n"

            file.write(v)
            file.write("\t")
            #2
            clnt.send(v) 

            if status[0] == 1:

                FILE = open("client1.txt","w+")
                print 'receive 01'
                #3
                while(1):
                    status[0] = 0
                    print '1st : receiving'
                    msg = clnt.recv(buf)
                    print len(msg)

                    if len(msg) < buf:
                        print 'break'
                        #FILE.close()
                        break 



        elif k == '02':
            print "2nd client connected", status[0]
            file.write("2nd\t") 

            if status[1] == 0:
                v = 'hold 02'
                check[1] = 1
            elif status[1] == 1:
                v = 'go 02'
                # status[0] = 0

            print v, "the message\n"

            file.write(v)
            file.write("\t")
            #2
            clnt.send(v) 

            if status[1] == 1:

                FILE = open("client2.txt","w+")
                print 'receive 02'
                #3
                while(1):
                    status[1] = 0
                    print '2nd : receiving'
                    msg = clnt.recv(buf)
                    print len(msg)

                    if len(msg) < buf:
                        print 'break'
                        #FILE.close()
                        break 

        if check[0] == 1:# and check[1] == 1:
            print j, 'here\n'
            j += 1
            for i in range(2):
                check[i] = 0
                status[i] = 1 # which means, all clients are connected
            print check, status
        else:
            print 'hello'

    except: pass 

file.close()
lstn.close() 

Upvotes: 0

Views: 1580

Answers (2)

Mark Tolonen
Mark Tolonen

Reputation: 177664

One problem is you are setting non-blocking mode:

clnt.setblocking(0)

But never checking that it is safe to send or recv data. It turns out that since the code is ignoring all exceptions, it isn't seeing the following error that I got when I removed the try:

Exception [Errno 10035] A non-blocking socket operation could not be completed immediately

After removing the setblocking call, the code proceeded further, but still has problems.

Describing what problem you are trying to solve would help to understand what the code is trying to do.

Upvotes: 2

Greg Hewgill
Greg Hewgill

Reputation: 993085

except: pass

You're ignoring all exceptions. This is a bad idea, because it doesn't let you know when things go wrong. You'll need to remove that except handler before you can reasonably debug your code.

Upvotes: 3

Related Questions