Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кДа если передающая сторона будет отсылать EOF можно было бы его ловить, но наверно передающая сторона и не посылает его rc=read(sock, &ch, 1); Когда rc == 0 это и есть EOF. Если rc < 0 это ошибки всякие. Касательно чтения когда длина известна. Напишите функцию read_all() которая принимает те же параметры но читает ровно заданное кол-во байтов (в цикле). Такой функцией намного удобнее и проще пользоваться чем вводить явные циклы в алгоритм, который по сути линейный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 15:38 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кДа спасибо. Да действительно, если я только знаю сколько байт приходит в одном пакете первые 4 байта пакета (204 байт), попробую только по одному пакету принимать и обрабатывать. Все таки размер приходит? Если так, то ты слишком много написал лишнего. Не надо высшей математики, можно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. PS В коде отступы не забывай делать. Читать невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 17:00 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Лучше все в одном цикле читать. Возможно что 4 байта размера не придут вместе, тогда твой и мой предыдущий вариант сглючат. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. PS Код не запускал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 17:50 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111к...если я только знаю сколько байт приходит в одном пакете первые 4 байта пакета (204 байт), попробую только по одному пакету принимать и обрабатывать..... Для тех кто на собаку говорит "корова" и ждёт молока под хвостом: в TCP протоколе НЕТ пакетов. Как только из своего лексикона уберёте эти термины - так сразу всё получится, гарантирую. Вы мульён тысяча третий, кто наступает на грабельки открыто лежащие... и как мантру наступая на грабли повторяете - tcp+пакты :( пока не обойдёте грабли - так и будут ошибки. можно ещё подпорочки лепить - тут уже ближе к людям в белых халатах тогда получается, чем программирование. (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 21:54 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
kolobok0, забей, горбатого могила исправит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2015, 01:29 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Да спасибо. Вроде подходит. Только я добавил после obrabwialonretr - break, чтобы вышел из цикла, далее нужно закрыть сокет и заново его открыть в цикле, если не выходить из цикла и не закрывать сокет и далее открывать и ждать следующего приёма данных, то неправильно работает приёмная часть кода. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2015, 07:48 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111к, если сервер тоже ты пишешь - используй протокол, ориентированный на сообщения, не на байты. Например, ZeroMQ Пример сервера Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Пример клиента Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Библиотека ZeroMQ - понятная, надежная и быстрая. Кроме того, что она ориентирована на сообщения, в ней масса вкусностей (типа встроенной очереди сообщений и автоматического реконнекта при обрыве соединения). И, хотя написана на С и для С, я, дельфятник использую её с удовольствием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 01:23 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Когда то пользовался но быстро не на гуглил в функции getsocopt ( в Linux & SCO , про винду не скажу, не знаю) есть параметр , который возвращает количество байт находящихся находящиеся в SO_RCVBUF буфере, готовые для чтения приложением на момент вызова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 01:52 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Спасибо. Да пока стандартного сокетного приёма хватит, пока без дополнительных библиотек (ZeroMQ) обойдусь, но буду иметь ввиду , к тому же я пишу только серверную часть, данные передаются по формату протокола WialonRetranslator. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 08:26 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кДа если передающая сторона будет отсылать EOF можно было бы его ловить, но наверно передающая сторона и не посылает его Нет, конечно же не посылает. Ты вообще в курсе, что такое EOF ? Он тут вообще ни при чём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 10:30 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
kolobok0t111к...если я только знаю сколько байт приходит в одном пакете первые 4 байта пакета (204 байт), попробую только по одному пакету принимать и обрабатывать..... Для тех кто на собаку говорит "корова" и ждёт молока под хвостом: в TCP протоколе НЕТ пакетов. Как только из своего лексикона уберёте эти термины - так сразу всё получится, гарантирую. Вы мульён тысяча третий, кто наступает на грабельки открыто лежащие... и как мантру наступая на грабли повторяете - tcp+пакты :( пока не обойдёте грабли - так и будут ошибки. можно ещё подпорочки лепить - тут уже ближе к людям в белых халатах тогда получается, чем программирование. (круглый) kolobok0, ты всё очень правильно написал, но только грабелек-то вообще-то и нет никаких. Я имею в виду, что это не недостаток спецификации протокола TCP, там как раз всё чётко обозначено. Это виртуальные грабли, которые себе придумывают программисты, не умеющие читать документацию, но по лбу их бьют они реально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 10:33 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
ДохтаРКогда то пользовался но быстро не на гуглил в функции getsocopt ( в Linux & SCO , про винду не скажу, не знаю) есть параметр , который возвращает количество байт находящихся находящиеся в SO_RCVBUF буфере, готовые для чтения приложением на момент вызова. И как это относится к предмету разговора ? ((подсказка -- никак)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 10:35 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кСпасибо. Да пока стандартного сокетного приёма хватит, пока без дополнительных библиотек (ZeroMQ) обойдусь, но буду иметь ввиду , к тому же я пишу только серверную часть, данные передаются по формату протокола WialonRetranslator. Тогда вообще не понятно, в чём там у тебя проблемы. WialonRetranslatorОписание протокола WialonRetranslator 1.0 Входящие данные . Все данные приходят в бинарном формате по TCP протоколу и представляют собой пакет следующего формата: Размер(байт) Тип поля Описание поля 4 Целое число Размер пакета - ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 10:39 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Да начал выдумывать, что может несколько пакетов данных WialonRetranslator нужно сразу принять за раз, а нужно было сделать приём одного пакета данных WialonRetranslator так как размер только одного пакета данных его нам и известен. Ну вроде сделал этот вариант, он приведён выше с моими небольшими изменениями о которых я написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 11:10 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кДа начал выдумывать, что может несколько пакетов данных WialonRetranslator нужно сразу принять за раз, а нужно было сделать приём одного пакета данных WialonRetranslator так как размер только одного пакета данных его нам и известен. Ну вроде сделал этот вариант, он приведён выше с моими небольшими изменениями о которых я написал. Это решается буфером размером около N средних пакетов. и массив описатель структур содержащих смещение в буфере и размер прочитанного из сокета. функция которая читает буфер берет все подряд, не глядя на границы блоков полученных по сети, удаляя уже обработанные блоки из массива описателя, когда буфер заканчивается , не обработанный блок переносится в начало буфера функцией memcpy и редактируется массив описатель. приблизительно так.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 11:51 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
ДохтаР, зачем так сложно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 14:58 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
ИзопропилДохтаР, зачем так сложно? Предложите проще. Я предложил такой вариант потому что это универсально и масштабируемо позволяет вынести работу с сокетами в отдельный с и h файлы и тягать между проектами, избавить от переключения контекста в голове программиста межу прикладной и сестемной логикой и (или) посадить еще одного програмиста на проект , так что бы они не толкались попами внутри одного кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 13:20 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
ДохтаР, Если учесть, что под некоторыми осями и(или) библиотеками прикрывающих сокеты именно так и делается (кванты приходящей информации от аппаратуры держаться в кольцевом буфере) - то выглядит Ваше предложение как минимум странно. Может быть стоит использовать опыт ранее накопленный? У юниксистов например - стандартная механизация: функция вычитывания из сокета известной длины данных, с формированием входного пользовательского буфера. (подсказка: вам никто не мешает гнать перед данными их длину, тогда тип длины данных - даёт величину вычитывания кол-ва байт на длину. например 4 байта) (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2015, 00:21 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39089490&tid=2018777]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
55ms |
get topic data: |
15ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 175ms |

| 0 / 0 |
