Как Socket может работать параллельно [Python] Ошибка 32 Сломанный канал - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь разработать приложение типа сервер-клиент. Я хочу отправить сообщение (список приведен ниже) клиенту с сервера. Все клиенты не связаны напрямую с сервером (Multi-hop). Я хочу получить подтверждение на стороне отправителя (сервер), когда клиент (получатель) получил сообщение. Если предположить, что сервер не получил подтверждение, сервер снова отправит это сообщение тому же клиенту. В моем коде я пытаюсь отправить обратно (с сервера на сервер) то же сообщение, что и подтверждение служить, но я получаю сообщение об ошибке.

Может ли какой-либо орган помочь исправить эту ошибку? Как я могу отправить подтверждение. сообщение серверу (отправителю) от клиента (получателя)

Заранее спасибо

import socket
import os,sys
import time
import concurrent.futures
from multiprocessing import Process

сторона отправителя

    MyNeighborSet_ip= ['192.168.1.2']    
    Data_transfer_listt = [['192.168.1.1', '192.168.1.2'], ['192.168.1.2', '192.168.1.3'], ['192.168.1.2', '192.168.1.4'], ['192.168.1.4', '192.168.1.5'], ['192.168.1.4', '192.168.1.6']]    
    received_list=[]
    def sending_Neighobr_ip_list():
        message='Neighbor_list_sending'
        PORT = 12345

    for k in range (len(MyNeighborSet_ip)):
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((MyNeighborSet_ip[k],PORT))    
        s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        for i in range(len(Data_transfer_listt)):
            receiver_ip=Data_transfer_listt[i][0]
            receiver_node_list=Data_transfer_listt[i][1]
            T_message= message + ";" + receiver_ip + ";" + receiver_node_list
            T_message_bytes= bytes(T_message,'utf-8')
            print("sending message",T_message_bytes)
            s.sendall (T_message_bytes)
            time.sleep(0.01)

        s.close()

def receive_ack():  

    PORT = 12345
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    s.bind(('',PORT))
    s.listen(1)
    conn,address=s.accept()
    while True:
        message_chunk=conn.recv(1024).decode()
        if not message_chunk:
            break
        received_list.append(message_chunk)    
    conn.close()
    print ("after the recv_message_list",received_list)
    return 


temp= concurrent.futures.ThreadPoolExecutor (max_workers=2)
temp.submit(sending_Neighobr_ip_list)
temp.submit(receive_ack)

Сторона получателя

data =[]
ip_list=[]
def frame_reception_function ():

    PORT = 12345
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    s.bind(('',PORT))
    s.listen(1)
    conn,address=s.accept()  
    while True:
        datachunk=conn.recv(1024).decode()  
        #print (conn)
        print (datachunk)
        if not datachunk:
            break  
        data.append(datachunk)  
        ip_list.append(address[0])
        T_message_bytes= bytes(datachunk,'utf-8')
        s.sendall(T_message_bytes)
    conn.close()
    return


if __name__ == '__main__':
  p1 = Process(target=frame_reception_function)
  p1.start()
  p1.join()
...