これは非常に基本的な質問だと思いますが、私のgoogle-fuは特定のヒットを生み出していません。私の問題は、WindowsとUNIXのTCPクライアント間のソケット通信の違いに関連しています。以下の非常に基本的なtcpサーバーコードを提供し、telnetまたはnetcat(telnet remotehost 9997など)を介してbsd / macos / linux経由で接続を確立すると、テキスト行を入力し、その後に改行を入力できます( \ r \ n)、サーバーが応答します。
Windows XPクライアントからtelnetアプリケーション(またはtelnetを使用するパテ)を介して接続を確立すると、接続できますが、サービスが応答を返す前に入力できるのは1文字のみです。WindowsとUNIXのネットワークスタックではソケットの処理方法が異なることに気付きましたが、奇妙なことに、パケットキャプチャから、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()
これは、Windowsクライアントから接続するときのサーバー側でのパケットキャプチャです。0x62(b)は、入力しようとしたときに入力した文字です:blah
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 E..5w.@. <..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 E..5..@. @.^.....
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 remotehost 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 E..7..@. <......)
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環境で何を変更すれば、文字列を渡すことができます。