0

これは非常に基本的な質問だと思いますが、私の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環境で何を変更すれば、文字列を渡すことができます。

4

1 に答える 1

1

期待どおりに機能します(プログラムは私たちが望んでいたことを実行しません。プログラムは私たちが指示したことを実行します)。Windows XP telnetにCRLFを送信させる方法が質問の場合は、適切なオプションを設定できます。

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

ただし、サーバーは行を読み取らないため、1024バイトを読み取ろうとするため、コードを再検討する必要があると思います。

これは役に立ちます。

于 2010-11-19T13:47:14.150 に答える