Здравствуйте!
Есть скрипт сервер и скрипт клиент, обменивающиеся данными через socket. Подключены через роутер. Проблема в том, что на Windows клиент работает нормально, а тот же клиентский код на ubuntu, независимо от параметра функции recv, обрезает данные, которые отправляются с сервера! Причем изменение с recv(1024), например на recv(8192) не дает никаких изменений, куски одного и того же размера приходят.
Данных отсылается примерно на 17 kB.
Есть еще две оговорки:
1) на винде возникает та же проблема, если подключить клиентский компьютер не через кабель к роутеру, а через wi-fi.
А если через кабель, то все отлично! Сервер в обоих случаях соединен с роутером по wi-fi.
При этот на ubuntu такая проблема всегда.
2) клиент является частью GUI приложения реализованном на pyqt, не думаю, что в этом дело, но все же...
Клиент:
def exchange_data(self, a, timeout=None):
"""Send commands to server and receive the answer from it"""
host = self.open_config()
port = 9090
gateway = socket.socket()
gateway.settimeout(timeout) # set response timeout
gateway.connect((host, port))
gateway.send(bytes(a, encoding = "utf-8"))
data = gateway.recv(1024)
log = gateway.recv(32768) # именно этот кусок данных независимо от параметра обрезается на ubuntu
gateway.close()
return data, log
Сервер:
port = 9090
sock = socket.socket()
# create a socket
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # reuse a local socket if it busy
sock.bind(('', port))
while True:
print('Receiving...')
sock.listen(1)
conn, addr = sock.accept()
try:
data = conn.recv(1024)
print("recive data: ", data)
# welcome
if data == b"conn":
conn.send(b'ok')
conn.close()
elif data == b"some_command":
os.system("python script.py {}".format(data.decode("utf-8"))) # decode a byte to string in command
# send data when it appear
while True:
# send values
with open("values", "rb") as f:
values= f.read()
if len(values) > 3:
conn.send(values)
# send other values
with open("other_values", "rb") as lg:
log = lg.read()
if len(log) > 3:
conn.send(log)
conn.close()
break
except Exception:
continue