s.recv зависает в python-сокетах - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть клиент и сервер.

От клиента я посылаю команду linux, которая отвечает через 80 секунд. Поскольку сервер не отвечает в течение начальных 80 секунд, возникает ошибка (s.recv) и время ожидания.

Пожалуйста, помогите, как действовать здесь?

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

        s.connect((hostname, self.port))
        s.sendall(self.msg)) # where msg is some linux command or script which replies after 80 seconds
        #s.shutdown(socket.SHUT_WR)
        while 1:

            data = s.recv(1024)
            if data == b"":
                break

            datai = datai + data.decode()
            self.result[hostname.decode()] = datai

1 Ответ

0 голосов
/ 01 ноября 2018

Я не мог воспроизвести это. Вот серверный и клиентский код, который почти тот, который у вас есть - он работает как нужно:

клиент:

#!/usr/bin/env python3

import socket   #for sockets
import sys  #for exit

try:
    #create an AF_INET, STREAM socket (TCP)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
    print 'Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]
    sys.exit();

print 'Socket Created'
host = 'localhost'
port = 8888

try:
    remote_ip = socket.gethostbyname( host )
except socket.gaierror:
    #could not resolve
    print 'Hostname could not be resolved. Exiting'
    sys.exit() 
print 'Ip address of ' + host + ' is ' + remote_ip

message = "The message \n"

#Code from Stackoverflow question
#s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # this is already done
s.settimeout(300)


#Connect to remote server
#s.connect((hostname, self.port))   # different variable name
s.connect((remote_ip , port)) 
print 'Socket Connected to ' + host + ' on ip ' + remote_ip

s.sendall(message) # where msg is some linux command or script which replies after 80 seconds
#s.shutdown(socket.SHUT_WR)
while 1:
    data = s.recv(1024)
    print("Ok, I get the response :)")

    if data == b"":
        break

    datai = "DATAI: "
    datai = datai + data.decode()
    #self.result[hostname.decode()] = datai
    print("Datai: " + str(datai))
#End

    break
s.close()

Сервер:

#!/usr/bin/env python3
'''
    Simple socket server using threads.
    Taken from: https://www.binarytides.com/python-socket-server-code-example/
'''
#Code for reproduce stackoverflow question 
from time import sleep
#End

import socket
import sys

HOST = ''   # Symbolic name, meaning all available interfaces
PORT = 8888 # Arbitrary non-privileged port

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'

#Bind socket to local host and port
try:
    s.bind((HOST, PORT))
except socket.error as msg:
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()

print 'Socket bind complete'

#Start listening on socket
s.listen(10)
print 'Socket now listening'

while 1:
    #wait to accept a connection - blocking call
    conn, addr = s.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])

    while True:         
        #Receiving from client
        data = conn.recv(1024)

        #Code for reproduce stackoverflow question 
        print("Waiting 80secs...")
        sec = 0
        while(sec < 80):
           sleep(10)
           sec = sec + 10
           print(str(sec))
        print("Ok, I'll reply...")
        #End 

        if not data: 
            reply = ""
        else:
            reply = 'OK...' + data
        conn.sendall(reply)
        break
    conn.close()
s.close()
...