Як відправити двійкове повідомлення в TCP і зберегти відповідь


0

Я повинен розробити клієнта для власного протоколу, і було б дуже корисно, щоб бути в змозі зрозуміти поведінку існуючого сервера, відправивши його користувальницькі повідомлення і подивитися на відповідь. "Telnet" ідеально підходить для цієї мети, за винятком того, що протокол є двійковим.

Так що в даний час, я написав повідомлення, я хочу (за допомогою шестнадцатеричного редактора) у файлі mymsg і я намагаюся надіслати його за допомогою netcat таким чином:

cat msg | netcat 127.0.0.1 1234

Моя проблема полягає в тому, що netcat просто зупиняється після того, як він досягає EOF, тому я ніколи не бачу відповіді сервера. Будь-які пропозиції?

(Звичайно, можна використовувати макет власного сервера nc -l -p 1234 )

Відповіді:


1

Я трохи здивований, тому що я вважав, що netcat має чітку функцію для обробки цього випадку. Я думав, що він чекав, поки він не отримав EOFs від стандартного входу і розетки. Можливо, це просто таймаут; перевірте документацію netcat, щоб дізнатися, чи є можливість продовжувати читати з сокета протягом певного часу після отримання EOF на stdin.

Або ви можете використовувати відповідь kludge:

(cat msg; sleep 42) | netcat 127.0.0.1 1234

Я припускаю, що ви згадуєте опцію -w N. Це не працює з коробки для мене :(. Крім того, я міг би щось відсутній, але kludge рішення не приймає вхід, коли він знаходиться в частині сну, так що це питання!
user229790

@ user229790: Я думаю -w робить щось інше, він явно говорить: "Якщо з'єднання і stdin не використовуються більше ніж ...", EOF не простоює. -i З іншого боку, звучить так, ніби варто спробувати: "Визначає інтервал часу затримки між рядками відправленого та отриманого тексту.".
Bobby

0

Я придумав цей скрипт python, щоб зробити цю роботу.

#!/usr/bin/env python

import socket
import sys

if (len(sys.argv) != 3):
    print "usage: " + sys.argv[0] + " host port <message >answer"
    print ""
    print "if you want to create a fake server side: nc -l -p port"
else:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((sys.argv[1], int(sys.argv[2])))
    msg = sys.stdin.read()
    s.send(msg)
    answer = s.recv(1024)
    print answer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.