Python tcp socketserver и различия между клиентами Windows и Unix - PullRequest
0 голосов
/ 19 ноября 2010

Я чувствую, что это очень простой вопрос, но мой гугл-фу не дает каких-либо конкретных хитов.Моя проблема связана с разницей связи сокетов между Windows и Unix TCP клиентами.Если я приведу приведенный ниже базовый код tcp-сервера и установлю соединение через bsd / macos / linux через telnet или netcat (например, telnet remotehost 9997), я смогу ввести строку текста, за которой следует новая строка (\ r \ n), и сервер отвечает.

Когда я устанавливаю соединение из клиента Windows XP, через приложение telnet (или замазку через telnet), я могу подключиться, но могу только набратьодин символ до того, как сервис вернет ответ.Я понимаю, что сетевые стеки 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, что позволит мне передать строку символов.

1 Ответ

1 голос
/ 19 ноября 2010

Работает, как и ожидалось ( программы не делают то, что мы хотели, они делают то, что мы им сказали ). Если ваш вопрос заключается в том, как заставить Windows XP telnet отправлять CRLF, вы можете установить соответствующую опцию:

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

Но я думаю, что вы должны пересмотреть свой код, потому что сервер не читает строки, он пытается прочитать 1024 байта.

Это полезно.

...