今日では、コンテンツの多くは2、UDPとTCPソケットのリモートコマンドで実行されます
最初は処分プログラムエラー昨日です:
エラー次のように:
お使いのサーバがまだ占有アドレスに手を振ってTIME_WAIT 4つの状態が存在するためです
2.syn 4つの洪水攻撃TIME_WAIT状態を振っ1.tcpスリーウェイハンドシェイクは、並行性の高いサーバ3がたくさんあります。
方法1:
#ソケット構成、IPとポートリユース追加 電話 = ソケット(AF_INET、SOCK_STREAM) (、SOL_SOCKET、SO_REUSEADDR phone.setsockoptを。1) #は、それが、バインドの追加の前にある phone.bindを((' 127.0.0.1 '、8080))
方法2:
この方法は、よりNiubiです、私はあなたが最初のセットを実行するためにLinuxのを見てみなければならないと思います
接続されている見られる大きなTIME_WAIT状態システムは、Linuxカーネル、パラメータを調整することによって解決される VIは、の/ etc / sysctl.confのの 編集ファイルは、次の追加: net.ipv4.tcp_syncookiesを = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 、次に実行 / sbinに/のsysctl - P-せテイク効果。 net.ipv4.tcp_syncookies = 1は、SYNクッキーの上に示されます。SYNキューのオーバーフローが発生した場合、ゼロ無効デフォルトは、少量SYN攻撃を防ぐことができ、プロセスクッキーにイネーブルされる。 net.ipv4.tcp_tw_reuse = 1は、再利用に示します。- TIMEせる、新しいTCP接続の再利用WAITソケットを、デフォルト値はゼロ無効である net.ipv4.tcp_tw_recycle - 1は時間を表しオープン= TCP接続を。、高速リカバリWAITソケットをデフォルトでオフに示し、0です。 システムのデフォルトのタイムアウト時間を変更net.ipv4.tcp_fin_timeout
第二に、サーバーベースおよびクライアントのUDPソケット端部
1.サーバー
インポートソケット #は、パラメータはサービスの確立の前に設定され内で可能であってもよいし、最新の変更の容易 ip_port =(「127.0.0.1 」、8080 ) back_log = 5 BUFFER_SIZE = 1024 #今、我々は、UDPプロトコルサーバを構築する必要が tcp_server = socket.socket(はsocket.AF_INET、socket.SOCK_DGRAM) tcp_server.bind(ip_port) #セット聞く必要はありませんベースのUDPプロトコル 位もそれほど受け入れていない、双方向の接続を確立するために必要な「3ウェイハンドシェイク」を通過する必要はありません一方TRUE: データ、ADDR = tcp_server.recvfrom(BUFFER_SIZE) #は、2つのメッセージ情報は、メッセージが、得られ、そして他方がロケーションと呼ばれる受信印刷(data.decode(「UTF-8 」)) 印刷(ADDR) tcp_server.sendto(data.upper()、ADDR) #を、コンテンツを送信すると、アドレス記述する必要あるとき tcp_server.closeを()
2.クライアント
インポートソケット ip_port =(' 127.0.0.1 '、8080 ) BUFFER_SIZE = 1024 ながらTRUE: tcp_client = socket.socket(はsocket.AF_INET、socket.SOCK_DGRAM) MSG =入力(' >>>:' ) tcp_client.sendto(MSG。エンコード(' UTF-8 ' )、ip_port) データ、ADDR = tcp_client.recvfrom(BUFFER_SIZE) プリント(data.decode(' UTF-8 '))
それはどのような利点がUDPソケットいるのですか?
最も明白には何のスリーウェイハンドシェイクと4は、操作の手を振っていないということです、そしてあなたが複数のクライアントと対話することができるように、同時に、クライアントから見ることができ、彼女も、バックログは、すべての木でした
TCPに基づいて第三に、リモートコマンドの実行
1.サブプロセス補助モジュール
STDOUT、標準エラー:入力:universal_newlines = Trueのは、それは文字列の値でなければならない場合、このパラメータはPopen.communicate()に渡され、このパラメータの正常値は、バイトの配列でなければなりません。
我々はコンテンツを取得するためにsubprocess.PIPEを渡す必要がある場合は、実行()関数は、通常の出力およびエラーのデフォルトのコマンド実行結果を取得しない場合、CompletedProcessによってインスタンス化することができるクラスは、stdoutとstderrまたは対応するコンテンツ属性をキャプチャを返さ。
()の呼び出しとcheck_call()関数むしろCompletedProcessクラスのインスタンスよりも、コマンド実行のステータスコードを返し、それはそれらのためだった、stdoutとstderr不適切割り当てsubprocess.PIPE。
check_output()関数は、そのstdoutに値を設定していない、我々は結果にエラーメッセージをキャプチャしたい場合は、あなたが標準エラー出力= subprocess.STDOUTを行うことができ、デフォルトのコマンドの実行結果を返します。
一例として、暫定的にDIRコマンド
subprocess.Popen( 'DIR'、シェル= Trueの場合、STDOUT = subprocess.PIPE、標準エラー出力= subprocess.PIPE、STDIN = subprocess.PIPE)
操作の各々に対応する出力情報、エラー情報と入力情報
あなたはこれらの三つの値を設定しない場合、彼らは直接画面に「パイプ」を介してデータをデフォルト設定されますが、今回は、対応する出力結果は、パイプラインに格納されています
RES = subprocess.Popen( 'DIR'、シェル= Trueの場合、STDOUT = subprocess.PIPE、標準エラー出力= subprocess.PIPE、STDIN = subprocess.PIPE)
得られた値は、直接クラスオブジェクトであるためres.stdout.read()メソッドは、使用するための理由を読ん
2.補足情報subprocessモジュールを終了し、我々は実際の動作を開始することができます
(1)最初の手のフィードバックタイムトライアルバー(UDPソケットに基づきます)
サーバー:
輸入ソケット、時間 #は簡単にポストに変わり、サービス設定の確立する前に発生する可能性のあるパラメータの範囲内にすることができ ip_port =(「127.0.0.1 」、8080 ) back_log = 5 BUFFER_SIZE = 1024 #今、我々は、サーバーのUDPプロトコルを構築する必要が = tcp_server socket.socket(はsocket.AF_INET、socket.SOCK_DGRAM) tcp_server.bind(ip_port) #セットリスン必要としないベースのUDPプロトコル #が、私はしませんので、また、双方向の接続を確立するために必要な「3ウェイハンドシェイク」を通過する必要はありません受け入れ必要しばらく:真の データ、ADDR = tcp_server.recvfrom(BUFFER_SIZE) #は、2件のメッセージの情報が得られる受信、メッセージであり、他方は位置と呼ばれるプリント(data.decode(「UTF-8 」)) 印刷(ADDR) MSG = data.decode(「UTF-8 」) #このような構成は、ユーザが私たちの時間の書式を設定することを可能にするのIF ない:MSGは、 #1 、我々は出力デフォルトをすることができ、裁判官は、ユーザーShurun時間形式が空でありますフォーマットは、 (= time.strftimeをtime_res ' - %%% X-D%Y-M ' ) 他: #は、ユーザの入力パラメータが優先NULL値でない time_resを= time.strftime(MSG) #「%% Y-M- X-%D% ' tcp_server.sendto(time_res.encode(' UTF-8 ')、ADDR) #書き込みアドレスの内容を送信する必要がある )(tcp_server.close
クライアント:
インポートソケット ip_port =(' 127.0.0.1 '、8080 ) BUFFER_SIZE = 1024 ながらTRUE: tcp_client = socket.socket(はsocket.AF_INET、socket.SOCK_DGRAM) MSG =入力(' >>>:' ) tcp_client.sendto(MSG。エンコード(' UTF-8 ' )、ip_port) データ、ADDR = tcp_client.recvfrom(BUFFER_SIZE) プリント(data.decode(' UTF-8 '))
クライアントの一部はほぼ横ばいだが、実際には非常にバンバンを感じます。
ここではリモートアシスタンスの意味に多少似てTCPプロトコルベースの、リモートコマンドの実行は、あります
サーバー:
ソケットのインポート * インポートサブプロセス ip_port =(' 127.0.0.1 '、8080 ) back_log = 5 BUFFER_SIZE = 1024 tcp_server = ソケット(AF_INET、SOCK_STREAM) tcp_server.bind(ip_port) tcp_server.listen(back_log) しばらく真: CONN、ADDR = tcp_server.accept() 印刷(' 新的客户端链接' 、addrは) しばらく真: #收 試し: CMD =conn.recv(BUFFER_SIZE) のIF ないが CMD:BREAKの 印刷(' コマンドを受信したクライアント' 、CMD) #ファイル名を指定して実行、cmd_res実行するコマンドの結果を得るために、 RES = subprocess.Popen(cmd.decode(' UTF-8を。')、 =シェル真、 標準エラー = subprocess.PIPE、 STDOUT = subprocess.PIPE、 STDIN = subprocess.PIPE) ERR = res.stderr.read() IF ERR: cmd_res= ERR 他: cmd_res = res.stdout.read() #の髪 IF ないcmd_res: cmd_res = ' 正常に実行' .encode(' GBK ' )#GBKなぜそれをここにある、命令実行システムは、システムのデフォルトのエンコーディングを使用していますWindowsのためのシステムは、GBKのです conn.send(cmd_res) を除く:例外としてE 印刷(E) BREAK
クライアント:
ソケットインポート * ip_port =(' 127.0.0.1 '、8080 ) back_log = 5 BUFFER_SIZE = 1024 tcp_client = ソケット(AF_INET、SOCK_STREAM) tcp_client.connect(ip_port) 一方TRUE: CMD =入力(' >>:' ).strip () 場合 ではない CMD:続ける 場合は CMD == ' 終了':ブレーク tcp_client.send(cmd.encode(' UTF-8 ' )) cmd_res= Tcp_client.recv(BUFFER_SIZE) プリント(' コマンドの実行結果である'、cmd_res.decode(' GBK ' )) tcp_client.close()
今日はこれらの内容で、私たちは多くのことを学んだ、実際には、UDPソケットは非常に強力で、私たちはQQは、典型的なUDPで使用し、あなたはそれだ多線接触を確保することができます
行って、ライン上で、実質的にあり得ることを握り避難Linuxでは、選択科目の手順を参照してください