LINUX.ORG.RU

непонятки с сокетами.


0

0

В main делаю нить, в ней крутится в бесконечном цикле accept по результату запускаю нить, куда передаю созданый сокет.

В ните крутится

recv
ожидание события 
pthread_mutex_lock( &mutex );
pthread_cond_wait( &cond, &mutex );
pthread_mutex_unlock( &mutex );
send

если reciv<=0 то делаю pthread_exit( NULL );

Интересность заключается, что когда я на клиенте закрываю соединение, у меня завершается не только нить, а вообще все приложение, не доходя до pthread_exit. куда копать?

Ответ на: комментарий от capricorn20

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

Artem-Dnepr
() автор топика
Ответ на: комментарий от Artem-Dnepr

> Если клиент отключился не вытащив все данные, которые предоставил сервер, то падает все приложение, а не просто вырубается нить. Странно.

В этом случае send/write возвратит EPIPE и процесс получит убойный SIGPIPE. Не знаю зачем SIGPIPE сделали таким суровым. Обходится вызовом sighold(SIGPIPE) в начале проги ;)

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

Работает. Спасибо.

То что пень на 64бит линухе, не успевает прогнать через localhost несколько тыс. TCP транзакий по 40 килобайт, у меня руки кривые, или QT тормозное?

Вообще, сколько можно прогнать через localhost на современном многоядерном пне?

Artem-Dnepr
() автор топика
Ответ на: комментарий от Artem-Dnepr

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

Artem-Dnepr
() автор топика
Ответ на: комментарий от Artem-Dnepr

ну, как бы recv всегда обрамляется в цикл, пока не вернет 0, что обычно означает, что буфер приема пуст.

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

> пока не вернет 0, что обычно означает, что буфер приема пуст.

А не то, что другой конец закрыл соединение?

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

да, пардон, перепутал.
если буфер приема пуст, то процесс будет висеть, пока сокет не отвалится или не придут новые данные.

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