LINUX.ORG.RU

Почему тут может вылетать программа?

 , ,


0

1

Если отправляю на обычный компьютер, то норм, а если на Android - то вылетает...

bool Socket::sendAll(void *buffer, int size) { if (!isValid()) return 0; char *ptr = (char*) buffer;

int counter = 0; while (size > 0) { int sz = ::send(m_sock, ptr, size, 0); usleep(1000); if (sz < 1) { counter++; if (counter > 10000) return false; continue; } ptr += sz; size -= sz; }

return true; }

Проблема в строке №42

yoghurt ★★★★★
()

ну а если серьезно - зачем usleep? Сокет синхронный? Сокет точно открыт в данный момент? Какого объема данные? Что говорит strace? Что говорит gdb?

yoghurt ★★★★★
()
bool Socket::sendAll(void *buffer, int size) { if (!isValid()) return 0; char *ptr = (char*) buffer;

расстреливат.

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

вроде как обычный код...

пишу свой класс Socket, функция sendall... isValid - проверяю на валидность, если норм, то вместо указателя на void* использую указатель на char*, чтобы работало ptr += sz;

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

А зачем тебе асинхронный сокет, если ты сверху костылишь блокирующее (для вызывателя) поведение?

Для начала просто шли буферы как есть через блокирующий сокет, для остальной части приложения (судя по коду) это останется незамеченным.

Ну и Стивенса читать в помощь.

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

Я же представил только часть кода... Уже без асинхронных сокетов никак...

Если будут асинхронные сокеты, то как тогда отправить через них буфер большого размера?

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

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

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

Да, понимаю, что код не совсем красивый и сляпан на коленке... Но, странно всё же, что на этой строчке send(m_sock, ptr, size, 0); вылетает... Уже даже просто интересно... Получается, что где-то переполняется некий буфер? (это только для андроид)

P.S. Спасибо за совет, обязательно перепишу в ближайшее время

sitev_ru
() автор топика
Ответ на: комментарий от yoghurt

strace не пользовался раньше - хорошая штука оказывается - показал мне, что отсылался сигнал SIGPIPE, теперь, если в send указываю флаг MSG_NOSIGNAL, то всё работает, как надо и не вылетает... спасибо

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

всё работает, как надо

SIGPIPE

/0

Если раньше система тебе сообщала, что ты пишешь в закрытый канал, но теперь не сообщает (но ты-то всё равно в него пишешь).

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

но в конечно итоге стало работать))) понимаю, что нужно переделать по уму, но как временный вариант сойдёт...

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