2010-11-19 14 views
0

私は、これは非常に基本的な質問であると感じ、私のGoogle-FUは、任意の特定のヒットを得ていません。私の問題は、WindowsとUNIX TCPクライアントのソケット通信の違いに関連しています。以下の非常に基本的なtcpサーバコードを提供し、telnetまたはnetcat経由でbsd/macos/linux経由で接続を確立すると(例えばtelnet remotehost 9997)、テキスト行を入力することができます。 \ r \ n)、サーバーが応答します。のpythonのTCP socketserverとWindowsとUNIXクライアントの違いは

telnetアプリケーション(またはtelnetを使用しているputty)経由でWindows XPクライアントから接続を確立すると、接続できますが、サービスが応答を返す前には1文字しか入力できません。私はWindowsとUNIXネットワークのスタックがソケットを別々に扱うことに気づいていますが、奇妙なビットは、私のパケットキャプチャから、私は復帰を追加するWindowsクライアントを見ません。

サンプルコード:Windowsクライアントからの接続時にここで

import SocketServer as socketserver 

class MyTCPHandler(socketserver.BaseRequestHandler): 

    def handle(self): 
     self.request.send("Welcome\r\n") 
     self.data = self.request.recv(1024).strip() 
     print("%s wrote:" % self.client_address[0]) 
     print(self.data) 
     self.request.send(self.data.upper()) 

if __name__ == "__main__": 

    server = socketserver.TCPServer(('', 9997), MyTCPHandler) 
    server.serve_forever() 

は、サーバー側でのパケットキャプチャです。何とか

0000 00 00 00 01 00 06 00 23 33 74 d5 3f 00 00 08 00 .......# 3t.?.... 
0010 45 00 00 35 77 86 40 00 3c 06 02 5a 0a 0e 14 29 [email protected] <..Z...) 
0020 0a 03 9c a9 c6 0e 27 0d 20 ed 36 de 87 f2 30 a2 ......'. .6...0. 
0030 80 18 ff ff 48 ee 00 00 01 01 08 0a 08 00 46 01 ....H... ......F. 
0040 94 f6 26 6f 62          ..&ob 

の0x42(B)ここで

0000 00 04 00 01 00 06 00 50 56 86 1a 4e 00 00 08 00 .......P V..N.... 
0010 45 00 00 35 16 fd 40 00 40 06 5e e3 0a 03 9c a9 [email protected] @.^..... 
0020 0a 0e 14 29 27 0d c6 0e 87 f2 30 a2 20 ed 36 df ...)'... ..0. .6. 
0030 80 18 00 b5 c5 0a 00 00 01 01 08 0a 94 f6 29 a0 ........ ......). 
0040 08 00 46 01 42          ..F.B 

は、UNIXクライアントからのパケットダンプがあると、サーバーが応答(netcatを:0x62(b)は、タイプする私の試みの間に、私が入力した文字でありますリモートホスト9997)、私は文字t(0x74)を入力し、0x0d0aを生成するキャリッジリターンに強制的にヒットする必要があります。

0000 00 00 00 01 00 06 00 23 33 74 d5 3f 00 00 08 00 .......# 3t.?.... 
0010 45 00 00 37 ee d2 40 00 3c 06 8b 0b 0a 0e 14 29 [email protected] <......) 
0020 0a 03 9c a9 c6 10 27 0d 69 ac 8e d6 b8 7b 92 b4 ......'. i....{.. 
0030 80 18 ff ff c4 b1 00 00 01 01 08 0a 08 00 48 1d ........ ......H. 
0040 94 f6 59 2b 74 0d 0a        ..Y+t.. 

私の質問は、このソケットサーバーをWindowsクライアントで使用するにはどうしたらいいですか?または、私はWindows環境で何を変更すると、文字列を渡すことができます。

+0

投稿した直後に問題が発生したと思います。 Windows telnetクライアントは真のrawソケットクライアント(ala netcat)ではありません。パテを使用し、 "未加工の"接続タイプオプションを指定すると、期待通りに –

答えて

1

期待通りに機能します(プログラムは私たちが望んだことをしませんでした。彼らは私たちに何を言ったかをとします)。あなたの質問は、Windows XPのtelnet送信CRLFを作成する方法である場合は、適切なオプションを設定することができます

telnet 
set ? 
set crlf 
open <host> <port> 

をしかし、私は、サーバーが行を読んでいないので、それはしようと、あなたのコードを再検討すべきだと思います1024バイトを読み取る。

Thisに便利です。

+1

が実行されます。これは私の代わりに、Windowsのtelnetクライアントがrawソケットクライアントであるという前提のために混乱していました。 –

関連する問題