URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8656
[ Назад ]

Исходное сообщение
"perl print сокет"

Отправлено Max Poldan , 22-Мрт-10 14:09 
вот строчка на perl:
print $SOCK $REQ;
где $SOCK открывается через функцию socket()
по какой причине, при интенсивном обмене информацией через $SOCK, данные могут искажаться?
и можно ли этого избежать?

Содержание

Сообщения в этом обсуждении
"perl print сокет"
Отправлено jd , 22-Мрт-10 18:40 
>по какой причине, при интенсивном обмене информацией через $SOCK, данные могут искажаться?

Какие данные и что значит "искажаться"? И при чём тут print? Задайте вопрос яснее.


"perl print сокет"
Отправлено Max Poldan , 23-Мрт-10 09:54 
>>по какой причине, при интенсивном обмене информацией через $SOCK, данные могут искажаться?
>
>Какие данные и что значит "искажаться"? И при чём тут print? Задайте
>вопрос яснее.

Есть клиент, есть сервер. Допустим клиент отдает на сервер через сокет строку: print $SOCKET $STRING. Так вот, при интенсивном обмене (много строк за малое время), эти строки могу накладываться друг на друга и сервер получает искаженную инофрмацию (из двух строк от клиента "string1" и "string2" сервер может получить одну - "strstring1ring2")
Вот где-то так...


"perl print сокет"
Отправлено ACCA , 23-Мрт-10 10:27 
>малое время), эти строки могу накладываться друг на друга и сервер
>получает искаженную инофрмацию (из двух строк от клиента "string1" и "string2"
>сервер может получить одну - "strstring1ring2")

<clairvoyance mode>

Дефективный сервер не понимает, что <$SOCKET> может вернуть и часть строки. Читать нужно до конца строки, а не до конца буфера, который ты можешь получить за одно чтение из <$SOCKET> на серверной стороне.

</clairvoyance mode>


"perl print сокет"
Отправлено Max Poldan , 23-Мрт-10 10:49 
><clairvoyance mode>
>
>Дефективный сервер не понимает, что <$SOCKET> может вернуть и часть строки. Читать нужно до конца строки, а не до конца буфера, который ты можешь получить за одно чтение из <$SOCKET> на серверной стороне.
>
></clairvoyance mode>

Сервер читает строки таким образом : while ($cmd=<CLIENT>)... Можно как-нибудь добится "...Читать нужно до конца строки, а не до конца буфера,..." в этом случае?


"perl print сокет"
Отправлено ACCA , 25-Мрт-10 07:52 
>><clairvoyance mode>
>>
>>Дефективный сервер не понимает, что <$SOCKET> может вернуть и часть строки. Читать нужно до конца строки, а не до конца буфера, который ты можешь получить за одно чтение из <$SOCKET> на серверной стороне.
>>
>></clairvoyance mode>
>
>Сервер читает строки таким образом : while ($cmd=<CLIENT>)... Можно как-нибудь добится "...Читать нужно до конца строки, а не до конца буфера,..." в этом случае?

while ($chunk=<CLIENT>) {
   $buf .= $chunk;
   @rows = split/\n/, $buf;

   if (substr($chunk, -1) eq "\n") {
          foreach $cmd (@rows) {
           ....
          }
          $buf = '';
   } else {
       if (@rows > 1) {
          $buf = pop @rows;
          foreach $cmd (@rows) {
           ....
          }
      }
   }
}


Если знать длину строки заранее, то можно сильно проще:
$socket->recv($cmd, $cmd_expected_length, SO_RCVLOWAT);


"perl print сокет"
Отправлено аноним , 23-Мрт-10 20:05 
>Есть клиент, есть сервер. Допустим клиент отдает на сервер через сокет строку:
>print $SOCKET $STRING. Так вот, при интенсивном обмене (много строк за
>малое время), эти строки могу накладываться друг на друга и сервер
>получает искаженную инофрмацию (из двух строк от клиента "string1" и "string2"
>сервер может получить одну - "strstring1ring2")
>Вот где-то так...

Такое возможно только при многопоточности, тогда надо соответствующим образом синхронизировать доступ к сокету.


"perl print сокет"
Отправлено аноним , 23-Мрт-10 05:23 
>и можно ли этого избежать?

binmode($SOCK) ?


"perl print сокет"
Отправлено Max Poldan , 23-Мрт-10 15:51 
>>и можно ли этого избежать?
>
>binmode($SOCK) ?

Под Unix binmode вроде как не имеет никакого эффекта.


"perl print сокет"
Отправлено аноним , 23-Мрт-10 20:04 
>Под Unix binmode вроде как не имеет никакого эффекта.

Это зависит от многих вещей, в том числе от всяких перловых unicode и utf8.