LINUX.ORG.RU

нити vs неблокирующий сокет

 ,


0

1

Есть два сокета на клиенте, по одному читаю данные, данные закончатся тогда, когда на другом сокете придет сообщение об этом. Что лучше применить: нити или сделать второй сокет неблокирующим? Машина будет одноядерной. И вообще нормально, если я в какой-то определенный момент делаю сокет неблокирующим, играюсь в свое удовольствие, после чего вновь делаю его блокирующим? Сильно не бить, Стивенса только недавно начал читать

★★

Почему не сделать один сокет и читать, пока нет сообщения о завершении?

anonymous
()

зачем два сокета?

Reset ★★★★★
()

если делать с потоками, тут же возникнет задача синхронизации данных. делай с epoll и не парься. тем более комп одноядерный.

это фтп на велосипеде что-ли?

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

обычного poll'а будет за глаза.

anonymous
()
Ответ на: комментарий от nanoolinux

да, протокол типа велосипедного фтп, сервер уже скомпилен, исходников нет, так что знаю только протокол и что используются 2 сокета

blokant ★★
() автор топика


Есть два сокета на клиенте, по одному читаю данные, данные закончатся тогда, когда на другом сокете придет сообщение об этом.


Нафиг надо. Лучше использовать какой-то свой протокол передачи данных, который будет обеспечивать определение конца. К примеру через указание размера передаваемых данных или через терминатор. Или (что ещё лучше) использовать уже готовые протоколы и библиотеки для работы с ними: json-rpc,xml-rpc, etc...


Что лучше применить: нити или сделать второй сокет неблокирующим?


Дело вкуса, как говориться. Правда имхо, лучше всего использовать какой-то один метод. Мешать не стоит, некрасиво будет.
Я бы сделал т ак. Написал-бы две реализации. Одну на блокирующих сокетах и тредах, другую на неблокирующих сокетах. И опыт будет и протестировать можно, что быстрее.

dmitryalexeeff
()
Ответ на: комментарий от blokant

Сервер закрывает сокет дата-канала по завершении передачи файла,
это конец. Так что одновременно работать с двумя сокетами нет нужды.

Нет никакого смысла делать сокет блокирующим, зачем зависать на сокете
нескончаемо, нужно с тайм-аутом

Тут
http://89.108.108.125:8282/client_ftp_public.txt
можете посмотреть простой ftp-клиент.

oleg_2
()
Ответ на: комментарий от oleg_2

Нет никакого смысла делать сокет блокирующим, зачем зависать на сокете нескончаемо, нужно с тайм-аутом

Так именно на блокирующий сокет и натравливают select() с таймаутом. Если сокет неблокирующий, read()/write() и так сразу возвращаются с -1 и ошибкой EAGAIN/EWOULDBLOCK.

gag ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.