Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Добрый день. У меня возник вопрос по сокетам в си. Как правильно написать, если сокет за один раз не сможет принять объём передаваемых данных rc = recv(sock, &buf_lin2, BufferLength,0 ); наверно уже будет не совсем верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 09:41 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 10:31 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Проверять по содержимому все пришло или нет. Формат передачи должен предусматривать указание где конкретно расположены данные, т.к. TCP-соединение просто передает поток байт. Например передаешь сначала размер блока данных, затем сами данные. При получении читаешь размер, затем данные, затем проверяешь все ли данные пришли или еще есть не принятые. Если есть непринятые - ждешь недостающее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 10:33 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Сделал так, но почему -то не работает первое чтение read отрабатывает а при 2 чтение вылетает из цикла не доходя даже до if(rc < 0) Код: 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. Да тут за раз всё передалось, но если не за раз как же здесь сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:21 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кДобрый день. У меня возник вопрос по сокетам в си. Как правильно написать, если сокет за один раз не сможет принять объём передаваемых данных rc = recv(sock, &buf_lin2, BufferLength,0 ); наверно уже будет не совсем верно? 0)для начала нужно напомнить, что если сокет не udp, то он потоковый. в нем нет сообщений и блоков. 1) сокеты - это файлы, можно просто читать read ом. посимвольно, построчно. это кстати не будет медленнее. 2) если за один recv не получилось принять, можно еще раз вызвать recv. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:43 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кСделал так, но почему -то не работает первое чтение read отрабатывает а при 2 чтение вылетает из цикла не доходя даже до if(rc < 0) Код: 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. Да тут за раз всё передалось, но если не за раз как же здесь сделать? если вылетает,то это наверное защита памяти, там ничто не может больше проводить к выходу из цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:47 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Так вот и непонятно что может быть, и ошибок не выдаёт то ведь просто выход происходит из цикла и процедуры char buf_lin2[50000]; int BufferLength=50000; Может как -то по другому написать? Есть правильнее запись этого безобразия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:56 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Нет я ошибся не выход происходит а в цикле while ждёт дальше прихода данных, я не знаю только сколько данных ко мне должно прийти, обычно приходит пакет, который может состоять и 204 байт или кратному быть этому размеру, и обычно вконце 204 байтом идёт символ strokdan[203] char 64 '@' strokdan[407] char 64 '@' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 12:02 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кНет я ошибся не выход происходит а в цикле while ждёт дальше прихода данных, я не знаю только сколько данных ко мне должно прийти, обычно приходит пакет, который может состоять и 204 байт или кратному быть этому размеру, и обычно вконце 204 байтом идёт символ strokdan[203] char 64 '@' strokdan[407] char 64 '@' Ну я так и думал. Но тут я ж говорю, тебе никто не поможет, ты должен сам понимать, когда и что ты должен получить. Это в TCP определяется протоколами высшего уровня -- HTTP, POP3 и так далее. Лучший выход -- не читать блоками, а читать посимвольно. Если там не мегабаты данных, то на производительности не скажется. Ну и можно сочетать -- знаешь, что должен получить большой блок данных -- читай большой блок (я бы читал всё же read-ом), не знаешь -- читай посимвольно, построчно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 12:43 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Спасибо. Попробую вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 13:42 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111к, Про потоковый подход - уже прозвучало. Обычно в обработчик TCP передают длину. И сам обработчик тупо читает необходимую длину. Например передали заголовок фиксированной длины - в нём указана длина полезных данных следуемый за ним. Либо читаете по символьно и как только пришла фраза "ЛЕНИН ЖИВ!!!" то понимаете что дальше у вас идут данные длиной в 1 мегабайт.... Ну и т.д.. (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 23:17 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кПопробую вот так: ... Тут как минимум надо добавить проверки: 1. выхода за пределы buf_lin2 2. обрыва соединения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 07:42 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Добрый день. И как это всё учесть? Если можно на конкретном примере, который я привожу. Приведённое выше не подходит так как я получаю набор байтов среди которых может быть и 0. Потом во входящих данных передаются пакеты размер которых я знаю там в байтах их размер и обычно это 204 байта, но мне неизвестно сколько пакетов приходит по 204 байтов, проблема ещё в том, что не передаётся размер общих входящих данных или символы окончания приёма данных. Пока остановился на таком, больше не знаю, что в данном случае можно ещё сделать. Да, тоже может попасть такой случай что будет кратно 204 и остаток от деления 0, но не всё передал. Код: 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. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 08:03 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Может еще быть случай когда придет два сообщения вместе. t111кво входящих данных передаются пакеты размер которых я знаю там в байтах их размер и обычно это 204 байта, но мне неизвестно сколько пакетов приходит по 204 байтов, проблема ещё в том, что не передаётся размер общих входящих данных или символы окончания приёма данных. В такой постановке задача нерешаема. Сформулируй и четко опиши формат передачи. Без слова "обычно", т.к. оно тут означает что иногда может прийти неожидаемый набор данных и все сглючит. Если каждый пакет 204 байта, то читай в буфер размером 204 байта. Буфер наполнился - пакет получен, обрабатываем, ждем следующий. PS Если есть возможность править код на второй стороне (которая отправляет), то меняй формат отправки. Например 4 байта размер данных, затем данные. Так будет намного проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 08:41 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Будем ориентироваться, что всегда приходят 204. Только сколько таких пакетов по 204 байтов предаётся неизвестно. Я взял BufferLength=50000, с запасом, Менять передающую программу я не могу, не у нас она формируется это WialonRetranslator по этому протоколу к нам поступают данные. Часто приходят 1 пакет по 204 байт, бывает несколько пакетов по 204 байтов. Промежуток при пересылках данных большой, накапливать больше 50000 он может долго, лучше сразу бы обработать, как пришли данные. А вот если так сделать. Будет ли этот кусочек программы правильно отрабатывать? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 09:35 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кБудем ориентироваться, что всегда приходят 204. Только сколько таких пакетов по 204 байтов предаётся неизвестно. Я взял BufferLength=50000, с запасом Зачем этот запас? Что мешает сделать BufferLength=204 ? Получил сообщение - сразу обработал. Жди следующее. Если оно уже есть, то сразу обработаешь, если нет, то код будет стоять на recv() пока не придет очередное или соединение не порвется. Если ждать не надо, то c помощью select() можно проверить есть что читать из сокета или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 10:06 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Так попробуй Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 10:19 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Dima T, косяк - recv может вернуть 0 при закрытии сокета передающей стороной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 10:25 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Точно, не силен в TCP, списал у t111к тогда заменить на Код: plaintext 1. Если не путаю, при открытом соединении recv() никогда 0 не вернет, т.е. будет висеть и ждать данные, если с настройками сокета не баловаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 10:33 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Dima TМожет еще быть случай когда придет два сообщения вместе. t111кво входящих данных передаются пакеты размер которых я знаю там в байтах их размер и обычно это 204 байта, но мне неизвестно сколько пакетов приходит по 204 байтов, проблема ещё в том, что не передаётся размер общих входящих данных или символы окончания приёма данных. В такой постановке задача нерешаема. Сформулируй и четко опиши формат передачи. Без слова "обычно", т.к. оно тут означает что иногда может прийти неожидаемый набор данных и все сглючит. Если каждый пакет 204 байта, то читай в буфер размером 204 байта. Буфер наполнился - пакет получен, обрабатываем, ждем следующий. PS Если есть возможность править код на второй стороне (которая отправляет), то меняй формат отправки. Например 4 байта размер данных, затем данные. Так будет намного проще. Я только ещё раз хочу напомнить, что никаких "сообщений" и "пакетов" в TCP нет. Приведённые тут эти слова -- это так, для обозначение посылок в общем смысле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 12:49 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111к, Здесь ошибка: Код: plaintext 1. 2. 3. 4. 5. 6. EOF - не уместится в char. read никогда не формирует EOF. Это ты перепутал с getc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 12:58 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Да нет я разместил EOF в int int prokon; ... prokon=ch[0]; while(prokon!= EOF) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 13:06 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
t111кДа нет я разместил EOF в int int prokon; ... prokon=ch[0]; while(prokon!= EOF) Ну до этого-то он должен появитсья как-то в ch[0] ... К тому же на кой тебе фиг массив из заведомо одного элемента, не подскажешь ? (ну это так, просто чтобы поржать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 13:12 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Да спасибо. Да действительно, если я только знаю сколько байт приходит в одном пакете первые 4 байта пакета (204 байт), попробую только по одному пакету принимать и обрабатывать. Пробую сейчас так, надеюсь правильно будет работать. Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 13:12 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#18+
Да если передающая сторона будет отсылать EOF можно было бы его ловить, но наверно передающая сторона и не посылает его rc=read(sock, &ch, 1); prokon=ch[0]; Да можно наверно char ch; и вот объявить одно символьную переменную и обращаться к ней prokon=ch; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 13:20 |
|
||
|
Сокеты в си
|
|||
|---|---|---|---|
|
#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?all=1&fid=57&tid=2018777]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 156ms |

| 0 / 0 |
