LINUX.ORG.RU

одновременная запись и чтение сокета (+)


0

0

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

И если да, какие могут быть моменты\сложности...

anonymous

не проверял, но не вижу причин почему бы это было невозможно. Буферы на приём и передачу разные и независимые.

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

>Буферы на приём и передачу разные и независимые.

буфера то разные, но вот дуплекс не везде полный.

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

>> но вот дуплекс не везде полный

> Could you elaborate on this?

Например, COM-port с PPP не является дуплексным каналом :) Полагаю, что *DSL тоже.

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

> Например, COM-port с PPP не является дуплексным каналом :) Полагаю, что *DSL тоже.

почему RS232 не является дуплексным каналом? по крайней мере на уровне интерфейса к железу и разводки это вполне даже себе дуплексный канал. отдельные линии приёма/передачи данных есть, раздельные буфера приёма/передачи то-же.

// wbr

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

> почему RS232 не является дуплексным каналом?

Самая распространенная распайка кабеля не является дуплексной, AFAIK :)

tailgunner ★★★★★
()

Да, можно. Сложности так, не особо... Например, close() не будет прерывать заблокировавшуюся операцию. А на других системах может и будет - такой мутноватый момент.

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

> Самая распространенная распайка кабеля не является дуплексной, AFAIK :)

почему же? наоборот, на RS232 везде есть разнесённые RX/TX и земля. управляющие сигналы по желанию.

// wbr

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

> Вообще-то да, возможно, наверное. А стандартные драйверы это поддерживают?

по идее да. по крайней мере приём и передача данных тактируются по прерыванию, буфера туда-сюда разные, регистры естественно то же etc.

// wbr

klalafuda ★☆☆
()

ну я так делал, все отлично работает. не вижу причин почему это не должно работать.

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

>> но вот дуплекс не везде полный

>Could you elaborate on this?

тот же самый ethernet switch... порт свича может быть и не в полном дуплексе, не смотря на то, что есть и RX и TX.

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

> порт свича может быть и не в полном дуплексе

при чём тут это? это уже проблема сетевухи и её phy. Не путайте тёплое с мягким. Мы говорим о transport level в моделе OSI

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

>> порт свича может быть и не в полном дуплексе

> при чём тут это? это уже проблема сетевухи и её phy. Не путайте тёплое с мягким. Мы говорим о transport level в моделе OSI

А зачем тебе одновременные запись/чтение, не для того, чтобы данные физически одновременно посылались и принимались?

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

>А зачем тебе одновременные запись/чтение, не для того, чтобы данные физически одновременно посылались и принимались?

я думаю вопрос был поднят для того чтобы узнать нужно ли лочить доступ к сокету когда работают несколько потоков)

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

> буфера то разные, но вот дуплекс не везде полный.

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

работа сокета (читай реализация сокета в ядре) вообще не зависит от выбранного канала.

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

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

Как же я в своё время намучился из-за того, что блокирующий read() нельзя прервать прервать этим close(). Под Линуксом ещё ничего: select, дополнительный pipe для передачи сообщения о том, что больше не хочу читать. А под виндой пришлось программировать их NamedPipes...

Андрей

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