Работа с винсокетами.
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
1. символ 0 для CSTRING означает конец строки - ну это в курсе наверное
2. а принимаешь чем recvfrom()? длина мессаги = 0?
3. а обрабатываешь прием в цикле? или один раз делаешь recvfrom? надо в цикле
3. как вариант: кодируй его другим знаком, вернее последовательностью знаков, например "\\+", перед отправкой и декодирую обратно при приеме
Написал: PAA(27)
2. а принимаешь чем recvfrom()? длина мессаги = 0?
3. а обрабатываешь прием в цикле? или один раз делаешь recvfrom? надо в цикле
3. как вариант: кодируй его другим знаком, вернее последовательностью знаков, например "\\+", перед отправкой и декодирую обратно при приеме
Написал: PAA(27)
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
....не пробовал правда, но я думаю получится
Написал: PAA(27)
Код: Выделить всё
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) ! ну тут суть только
Что-то вы, ребята, мудрите без меры
гораздо проще нужно быть - просто наполнять CSTRING как байтовый массив, интерпретировать как байтовый массив и при работе не пользоватся функциями работы со строками (всякие CLIP и LEN).
Подготовили перед вызовом байтовый массив, хранящийся в переменной типа CSTRING (как того требует прототип API-функции), передали ее и количество байт в массиве (а не длину!!!) и вызывали API
гораздо проще нужно быть - просто наполнять 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
вот модификация:
в мапе:
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