Как получить доступ к сокету для множественного приема, используя поток - PullRequest
0 голосов
/ 26 июня 2018

Здравствуйте, я новичок в области сетей и использую сокет в Python Я пытаюсь получить доступ к функции frame_reception_function (), но получаю ошибку "OSError: [Errno 98] Адрес уже используется" В forward_send_received () я вызываю четыре разные функции с использованием потока, потому что в моей работе этот узел может принимать кадр запроса с предыдущего узла, а также должен перенаправить этот кадр на следующий узел, а также получать кадр данных с следующего узла и отправить на предыдущий узел. так он получил два с двух сторон. Как можно получить доступ к одному и тому же сокету. Я также закрываю соединение, но оно не работает. Может ли кто-нибудь помочь мне удалить вышеуказанную ошибку (адрес уже используется)

def frame_reception_function ():      
    print ("starting of frame reception")
    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()
    message=conn.recv(1024).decode()
    conn.close()
    recv_message=message.split(';')

    message_type=recv_message[0]
    if (received_message=='req_status'):
        print ('Received Message is req_status')

        previous_ip=recv_message[1]     
        return message_type,previous_ip,recv_message
    else:
        print ("received message is :",received_message)
        print ("Received from:",recv_message[4])
        ip=recv_message[4]
        #cmd = "arp -n " + str(ip) +  " | awk '/" + str(ip) + "/{print $3}'"          # Can we extract MAC address from IP instead of Broadcast address???
        #x = os.popen(cmd).read().strip()
        return recv_message[0],ip,recv_message


def forward_send_received():
    Frame_type,ip_address,received_message=frame_reception_function ()
    print ("after while")
    print (Frame_type)
    print (Frame_SrcAddr)
    print (ip_address)
    print (received_message)


    if (Frame_type=="req_status"):
        if (not Req_Frame_Relayed):             # Check Req_Frame_status

            forward_req_status_frame()
            Req_Frame_Relayed=True
            Probabilistic_Reliable_Broadcast(Frame_type)
            Send_Data_status_frame()
            Probabilistic_Reliable_Broadcast("current_node_data")
    else:

        if (Frame_SrcAddr not in Resp_forwarded_set):
            Resp_forwarded_set()
            forward_Data_status_frame(received_message)
            Resp_number=Resp_number+1
            Probabilistic_Reliable_Broadcast(Frame_type)

while (time.time()-start_time<Status_collecting_time_interval) and (Resp_number<Nmax):
    print ("starting of while ")
    Thread(target=forward_send_received).start()
...