Делая сервис с TCP наступил на все существующие грабли (до этого AutoIt не использовал в подобных целях) и пришел с такому коду, который успешно использую для приема xor'енных UTF8 данных на сервере и на клиенте. Весь код для быстрого восприятия прокомментирован:
Буду рад, если вы прокомментируете о ошибках, которые я могу не видеть или предложите свой вариант соответствующий требованиям:
1. В течении 5 сек ждать приема данных
2. Выходить из приема, если данные больше не поступают
3. Принимать любой объем данных
4. Надежно расшифровывать UTF8 данные, даже если код символа начинается в конце первой порции TCPRecv и продолжается в начале следующей.
Код:
$server_receive_timeout_timer = TimerInit()
$server_receive_dannie = '' ; Все байты
$server_receive_dannie_new = '' ; Порция байт
$server_receive_recv_start = 0 ; Флаг приема
While TimerDiff($server_receive_timeout_timer) < 5000 ; Тайм аут через 5 секунд попыток приема
$server_receive_dannie_new = TCPRecv($server_receive_socket, 128, 1)
If $server_receive_dannie_new = '' Then ; Если байты не поступили
If $server_receive_recv_start = 1 Then ;... и прием уже идет
ExitLoop ;... конец приема
EndIf
Else
$server_receive_recv_start = 1 ; Если байты поступили - прием начался
EndIf
$server_receive_dannie &= StringReplace($server_receive_dannie_new, '0x', '') ; Убрать "0x" от TCPRecv
WEnd
$server_receive_dannie = BinaryToString('0x' & $server_receive_dannie, 4)
Буду рад, если вы прокомментируете о ошибках, которые я могу не видеть или предложите свой вариант соответствующий требованиям:
1. В течении 5 сек ждать приема данных
2. Выходить из приема, если данные больше не поступают
3. Принимать любой объем данных
4. Надежно расшифровывать UTF8 данные, даже если код символа начинается в конце первой порции TCPRecv и продолжается в начале следующей.