Работа с винсокетами.

CWICWEB, ClarioNET и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Кто знает как передать цепочку байтов, используя винсокет. Строку получается передать, а вот с передачей байтов проблема возникла. В частности, не могу передать спецсимвол 00H.
Примеры смотрела, но там везде передается строка.
Заранее всем благодарна.
Анна.
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

1. символ 0 для CSTRING означает конец строки - ну это в курсе наверное
2. а принимаешь чем recvfrom()? длина мессаги = 0?
3. а обрабатываешь прием в цикле? или один раз делаешь recvfrom? надо в цикле
3. как вариант: кодируй его другим знаком, вернее последовательностью знаков, например "\\+", перед отправкой и декодирую обратно при приеме
Написал: PAA(27)
Гость

Сообщение Гость »

В том то и дело, что принимать будет не моя прога, поэтому мне и надо выпульнуть этот символ.
А с кодированием и декодированием хорошая идея, но мне не подходит.
Вот, поэтому я в тупике.
Подскажите, что можно еще сделать.
Анна.
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

....не пробовал правда, но я думаю получится

Код: Выделить всё

DataString  STRING(нужный размер)        ! строка данных
cstrData     CSTRING(нужный размер+1) ! отсылаемая строка

 code
 DataString='bla bla...<0>...bla bla'

 Len#=len(clip(DataString)) ! надо подумать насчет последнего символа <0>

! а вместо присвоения cstrData=DataString
 memcpy(address(cstrData), address(DataString),Len#)  

 Err#=send(tcpSocket,address(cstrData),Len#,0) ! ну тут суть только

Написал: PAA(27)
Гость

Сообщение Гость »

Попробовала как вы предложили и все равно получила на другом конце только часть,которая стояла до <0>, остальное обрезалось.
Облом.
Мне тут предлагали делать через массив байт, но у меня все равно не получается или я что-то не так сделала.
Спасибо, вам Still Zero за помощь.
Анна.
Гость

Сообщение Гость »

Что-то вы, ребята, мудрите без меры :)
гораздо проще нужно быть - просто наполнять CSTRING как байтовый массив, интерпретировать как байтовый массив и при работе не пользоватся функциями работы со строками (всякие CLIP и LEN).
Подготовили перед вызовом байтовый массив, хранящийся в переменной типа CSTRING (как того требует прототип API-функции), передали ее и количество байт в массиве (а не длину!!!) и вызывали API
Гость

Сообщение Гость »

Если не трудно киньте примерчик, пожалуйста.
Гость

Сообщение Гость »

Да что ж тут писать?

вот модификация:

в мапе:
s32_send(SOCKET,*CSTRING,SHORT,SHORT),SHORT,RAW,PASCAL,NAME('SEND'),DLL(dll_mode)

cstrData CSTRING(1024) ! отсылаемая строка
Len SHORT

code
cstrData='aaaa<0>bbbb'
Len = 9
! т.е. пересылаем 9 байт
UNLOCKTHREAD
Err#=s32_send(tcpSocket,address(cstrData),Len,0)
LOCKTHREAD
IF Err# <> Len
имеем проблемы с отправкой
END
Гость

Сообщение Гость »

Спасибо, все заработало:-)
Анна.
Ответить