вот строчка на perl:
print $SOCK $REQ;
где $SOCK открывается через функцию socket()
по какой причине, при интенсивном обмене информацией через $SOCK, данные могут искажаться?
и можно ли этого избежать?
>по какой причине, при интенсивном обмене информацией через $SOCK, данные могут искажаться?Какие данные и что значит "искажаться"? И при чём тут print? Задайте вопрос яснее.
>>по какой причине, при интенсивном обмене информацией через $SOCK, данные могут искажаться?
>
>Какие данные и что значит "искажаться"? И при чём тут print? Задайте
>вопрос яснее.Есть клиент, есть сервер. Допустим клиент отдает на сервер через сокет строку: print $SOCKET $STRING. Так вот, при интенсивном обмене (много строк за малое время), эти строки могу накладываться друг на друга и сервер получает искаженную инофрмацию (из двух строк от клиента "string1" и "string2" сервер может получить одну - "strstring1ring2")
Вот где-то так...
>малое время), эти строки могу накладываться друг на друга и сервер
>получает искаженную инофрмацию (из двух строк от клиента "string1" и "string2"
>сервер может получить одну - "strstring1ring2")<clairvoyance mode>
Дефективный сервер не понимает, что <$SOCKET> может вернуть и часть строки. Читать нужно до конца строки, а не до конца буфера, который ты можешь получить за одно чтение из <$SOCKET> на серверной стороне.
</clairvoyance mode>
><clairvoyance mode>
>
>Дефективный сервер не понимает, что <$SOCKET> может вернуть и часть строки. Читать нужно до конца строки, а не до конца буфера, который ты можешь получить за одно чтение из <$SOCKET> на серверной стороне.
>
></clairvoyance mode>Сервер читает строки таким образом : while ($cmd=<CLIENT>)... Можно как-нибудь добится "...Читать нужно до конца строки, а не до конца буфера,..." в этом случае?
>><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);
>Есть клиент, есть сервер. Допустим клиент отдает на сервер через сокет строку:
>print $SOCKET $STRING. Так вот, при интенсивном обмене (много строк за
>малое время), эти строки могу накладываться друг на друга и сервер
>получает искаженную инофрмацию (из двух строк от клиента "string1" и "string2"
>сервер может получить одну - "strstring1ring2")
>Вот где-то так...Такое возможно только при многопоточности, тогда надо соответствующим образом синхронизировать доступ к сокету.
>и можно ли этого избежать?binmode($SOCK) ?
>>и можно ли этого избежать?
>
>binmode($SOCK) ?Под Unix binmode вроде как не имеет никакого эффекта.
>Под Unix binmode вроде как не имеет никакого эффекта.Это зависит от многих вещей, в том числе от всяких перловых unicode и utf8.