The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"perl print сокет"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

  • perl print сокет, jd, 18:40 , 22-Мрт-10, (1)  
  • perl print сокет, аноним, 05:23 , 23-Мрт-10, (2)  
    • perl print сокет, Max Poldan, 15:51 , 23-Мрт-10, (6)  
      • perl print сокет, аноним, 20:04 , 23-Мрт-10, (7)  

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

<clairvoyance mode>

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

</clairvoyance mode>

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

9. "perl print сокет"  +/
Сообщение от ACCA (ok) on 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);

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "perl print сокет"  +/
Сообщение от аноним on 23-Мрт-10, 05:23 
>и можно ли этого избежать?

binmode($SOCK) ?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "perl print сокет"  +/
Сообщение от Max Poldan on 23-Мрт-10, 15:51 
>>и можно ли этого избежать?
>
>binmode($SOCK) ?

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "perl print сокет"  +/
Сообщение от аноним on 23-Мрт-10, 20:04 
>Под Unix binmode вроде как не имеет никакого эффекта.

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру