LINUX.ORG.RU

Простой client/server в tcl (клиент) затыкается


1

1

Клиент из баша (работает)

$ exec 3<>/dev/tcp/10.0.0.48/8888
$ cat <&3 &
[1] 7127
$
$ echo '=1+2+3$' >&3  --> запрос к серверу
$ =1+2+3 = 6          <-- ответ от сервера (вывел cat)
 

$ tclsh
% set chan [socket 10.0.0.48 8888]
sock21efb30
% puts $chan {=1+2+3$}
% flush $chan
% puts [gets $chan]
               Здесь висит gets ...

Не пойму в чем проблема?

Логи сервера одинаковые в обоих случаях: расчет сделан, ответ отослан.

★★★★★

Последнее исправление: sdio (всего исправлений: 1)

offtopic

exec 3<>/dev/tcp/10.0.0.48/8888
cat <&3 &

/me ушел учиь bash

anonymous
()

Вот этот ответ, который cat выводит — у него в конце есть LF? И вообще хорошо было бы через wireshark записать оба обмена, чтобы ни один байт мимо взгляда не прошёл.

Кстати, одно из отличий в том, что в запросе из TCL по умолчанию будет CR+LF, а в запросе из bash — только LF. Едва ли это на что-то влияет.

LeninGad
()
Ответ на: комментарий от LeninGad

Логи сервера одинаковые в обоих случаях: расчет сделан, ответ отослан.

wireshark да надо посмотреть

sdio ★★★★★
() автор топика

Все работает

$ echo "wow" | nc -l -s 127.0.0.1 -p 8888 &
[1] 9104 9105
$ tclsh tcp.tcl
wow
=1+2+3$
[1]  + 9104 done       echo "wow" |
       9105 done       nc -l -s 127.0.0.1 -p 8888
$ cat tcp.tcl
#!/usr/bin/env tclsh

set addr {127.0.0.1}
set port 8888

set chan [socket $addr $port]
puts $chan {=1+2+3$}
flush $chan
puts [gets $chan]
gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от sdio

Wireshark говорит что:

Сервер не посылает в строке \n
ответ от сервера приходит, но gets ждет окончания строки.

Сейчас поправлю сервер и посмотрим.

Update: Да! Добавил \n в ответ от сервера и все заработало.

Всем (MKuznetsov, LeninGad) спасибо!

sdio ★★★★★
() автор топика
Последнее исправление: sdio (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.