61

Peter пишет:

Благодарю за разъяснение

абзац про маму прочитали?

Peter пишет:

А зачем именно мой бинарник?

вы же хотите узнать, где У ВАС ошибка?

Peter пишет:

Т.е. я понимаю, зачем, но я вовсе не прошу кого-то в нём ковыряться.

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

Peter пишет:

Если есть ошибка в тексте, она может быть обнаружена при его анализе.

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

Peter пишет:

-O3 я использую всегда

я и не сомневался. Кстати по моей ссылке про это есть.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

62

Да, мне нужна только та ошибка, из-за которой в Ubuntu нарушаются
причинно-следственные связи, но ни её, ни других я не вижу.
И вы же сами расхваливали способность компилятора оптимизировать код,
почему же вам не нравится -O3?

Пётр.

Пётр.

63

Peter пишет:

И вы же сами расхваливали способность компилятора оптимизировать код,
почему же вам не нравится -O3?

я не восхвалял. Я вам доказал, что оптимизированный код изменён до полной неузнаваемости. Если ваш код на 146% соответствует стандарту, то он будет работать точно также по результату, иначе — как карта ляжет. Причём ошибка может таится в самом неожиданном месте.

ну вот вам пример: http://blog.llvm.org/2011/05/what-every … ow_14.html

void contains_null_check(int *P) {
  int dead = *P;
  if (P == 0)
    return;
  *P = 4;
}

компилятор _может_ превратить в

void contains_null_check_after_RNCE_and_DCE(int *P) {
  *P = 4;
}

А может и не превратить. Зависит от фазы луны.

А всего-то была проблема в том, что в данном коде разименовывается указатель P. Причём результат ни на что не влияет, т.к. переменная dead НЕ используется. На первый взгляд: ну и что? На второй: а действительно, что?
Фишка в том, что разименованный NULL, это UB. А UB это вовсе не "непонятный результат", всё намного хуже, это неопределённое ДЕЙСТВИЕ. Т.е. компилятор в данном случае, по стандарту(sic!) может рожать любой код. Ну при -O3 он естественно ничего не рожает, ибо "ничего" самое быстрое. Проблема в том, что это "ничего" намного сильнее, чем вы думаете, ВНЕЗАПНО, компилятор не только ничего не делает для разименования, но и считает, что само разименование невозможно! (имеет право, да). А значит, P ВСЕГДА НЕ NULL! А раз так, то и проверка не нужна.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

64

drBatty пишет:
Peter пишет:

И вы же сами расхваливали способность компилятора оптимизировать код,
почему же вам не нравится -O3?

я не восхвалял. Я вам доказал, что оптимизированный код изменён до полной неузнаваемости. Если ваш код на 146% соответствует стандарту, то он будет работать точно также по результату, иначе — как карта ляжет. Причём ошибка может таится в самом неожиданном месте.

ну вот вам пример: http://blog.llvm.org/2011/05/what-every … ow_14.html
...

Так пример с contains_null_check - это просто ошибочный код, так нельзя делать.
А для sockaddr_in и sockaddr sizeof() вернул одинаковый размер.
Наверное, в Ubuntu что-то в её глубинах неправильно, если она, в отличие от Debian, в Qt неверно выдерживает timeout
для таймера в Qt и gettimeofday() влияет на sendto().

Пётр.

Пётр.

65

Peter пишет:

Так пример с contains_null_check - это просто ошибочный код, так нельзя делать.

ну вы же делаете…

Peter пишет:

А для sockaddr_in и sockaddr sizeof() вернул одинаковый размер.

где? Не в убунте, а в астре? Дык там и так ВР.

Peter пишет:

Наверное, в Ubuntu что-то в её глубинах неправильно

дык давайте бинарник, чего вы боитесь-то? Можете мне лично отправить на emulek.bx@gmail.com

Peter пишет:

если она, в отличие от Debian, в Qt неверно выдерживает timeout

это совершенно другая тема. Ну и вы опять не проверяли ещё хотя-бы на десяти дистрибутивах. Да и в проблеме не разобрались.

Peter пишет:

gettimeofday() влияет на sendto().

значит это глюк glibc. Давайте проверим на моей, ванильной версии. Если на ванили заработает, значит действительно, патч убунты испортил glibc. Пошлём багрепорт, и они быстренько исправят.

А нытьём и разговорами мы ничего не добьёмся.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

66

Peter пишет:

Наверное, в Ubuntu что-то в её глубинах неправильно, если она, в отличие от Debian, в Qt неверно выдерживает timeout
для таймера в Qt

Неверно - это меньше запрошенного. А больше допускается. Изучайте документацию.

67 (03.02.2015 13:47:06 отредактировано )

s.xbatob пишет:
Peter пишет:

Наверное, в Ubuntu что-то в её глубинах неправильно, если она, в отличие от Debian, в Qt неверно выдерживает timeout
для таймера в Qt

Неверно - это меньше запрошенного. А больше допускается. Изучайте документацию.

Так меньше никак не должно быть, только больше.
Но в Debian Wheezy выдерживается точно.

Пётр.

drBatty пишет:
Peter пишет:

Так пример с contains_null_check - это просто ошибочный код, так нельзя делать.

ну вы же делаете…

Нет, такого я не делаю.

Peter пишет:

А для sockaddr_in и sockaddr sizeof() вернул одинаковый размер.

где? Не в убунте, а в астре? Дык там и так ВР.

И в Ubuntu обе по 16 байтов.

Peter пишет:

Наверное, в Ubuntu что-то в её глубинах неправильно

дык давайте бинарник, чего вы боитесь-то? Можете мне лично отправить на emulek.bx@gmail.com

Отправил. По-прежнему с gettimeofday() sendto() заканчивается с ошибкой 22, без неё работает.
Наверное, это чьи-то козни.

Пётр.

Пётр.

68

Peter пишет:

Но в Debian Wheezy выдерживается точно.

ну и что?

Peter пишет:

Отправил. По-прежнему с gettimeofday() sendto() заканчивается с ошибкой 22, без неё работает.
Наверное, это чьи-то козни.

сейчас гляну…

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

69

Peter, ну вы мне вторую часть вышлите, а то первая часть просто висит, и ждёт.

код лень ковырять, там Ад и Израиль.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

70

drBatty пишет:

Peter, ну вы мне вторую часть вышлите, а то первая часть просто висит, и ждёт.

код лень ковырять, там Ад и Израиль.

Разумеется, но 2-я часть, которая по смыслу 1-я - это реальная программа, она будет работать,
только если к компьютеру подключена некоторая аппаратура, а без неё она я не уверен, что вообще запустится.
Я попробую сделать её имитатор наподобие присланного и отправлю.
Я думал, вы хотите чем-то посмотреть сам elf.
Для преобразования программы в стандартный вид я пользуюсь командами

#!/bin/bash

nam=`echo $1 |cut -d "." -f 1`
sff=`echo $1 |cut -d "." -f 2`
mv -f $1 ${nam}_ori.$sff
indent -kr -brf -ci0 -l80 -nbfda -cdw ${nam}_ori.$sff -o $1

где параметр - имя файла.

Пётр.

Пётр.

71

Peter пишет:

Я думал, вы хотите чем-то посмотреть сам elf.

у вас очень зависимый код. Такой блоб из одной функции, где всё друг за друга цепляется. Компилятор пытается это всё по регистрам распихать, получается ещё хуже, т.к. вы обожаете отправлять куски памяти в стандартные функции. Но всё равно компилятор распихивает данные и в память и в регистры, причём регистров в amd64 довольно много разных.

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

72 (03.02.2015 16:56:04 отредактировано Peter)

Отправил работающую пару.
Не понял, зависимый в каком смысле? Я вызываю функции согласно man, и ведь в случае
массива в любом случае передаётся адрес.

Пётр.

Пётр.

73

Peter пишет:

Не понял, зависимый в каком смысле?

я же говорю: адский клубок и переплетение памяти, регистров, и т.п. Чёрт ногу сломит. Код ужасен.

ЗЫЖ отправьте пожалуйста ещё и рабочий вариант, попробую найти разницу, если это конечно возможно.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

74

drBatty пишет:
Peter пишет:

Не понял, зависимый в каком смысле?

я же говорю: адский клубок и переплетение памяти, регистров, и т.п. Чёрт ногу сломит. Код ужасен.

ЗЫЖ отправьте пожалуйста ещё и рабочий вариант, попробую найти разницу, если это конечно возможно.

Там же всё делается последовательно, переменных немного. Не понимаю, какое переплетение.
Рабочий вариант вам не пригодится, он на Qt, он слишком велик, там много потоков, там вообще всё иначе.
И уж там такое переплетение, что я сам иногда с усилием разбираюсь, если надо что-то изменить.
Здесь только имитация приёма/передачи.

Пётр.

Пётр.

75

drBatty пишет:
Peter пишет:

Не понял, зависимый в каком смысле?

я же говорю: адский клубок и переплетение памяти, регистров, и т.п. Чёрт ногу сломит. Код ужасен.

Всё думаю, что там может быть ужасного. Это короткая линейная программа, с тремя вызовами функций.

Пётр.

Пётр.

76

Peter пишет:

Там же всё делается последовательно, переменных немного.

у переменных слишком большое время жизни, как у глобальных. Если бы вы объявляли переменные там, где оно надо, то всё было-бы проще. Но вы сами себе создаёте проблемы.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

77

drBatty пишет:
Peter пишет:

Там же всё делается последовательно, переменных немного.

у переменных слишком большое время жизни, как у глобальных. Если бы вы объявляли переменные там, где оно надо, то всё было-бы проще. Но вы сами себе создаёте проблемы.

Совершенно не вижу в этом проблемы. Несколько байтов или несколько их десятков не жалко, а так единообразнее.
И вообще обычный C требует, чтобы объявления располагались до исполнимых операторов.

Пётр.

Пётр.

78

Peter пишет:

Совершенно не вижу в этом проблемы. Несколько байтов или несколько их десятков не жалко, а так единообразнее.

ну вы не видите, а я вижу.

Peter пишет:

И вообще обычный C требует, чтобы объявления располагались до исполнимых операторов.

бред.
можно даже в for(;;) переменные объявлять (хотя это уже ИМХО извращение).

https://en.wikipedia.org/wiki/Best_practice ИМХО объявлять переменные с самым меньшим временем жизни, насколько это возможно. Самое поганое — глобальные(ну или как у вас, те, что живут всё время работы). У вас же есть блоки {в таких скобках}, почему не объявить переменную там, если она нужна лишь внутри блока?

Некоторые переменные вообще не нужны, как эта ваша len. Вот зачем вам сначала кастовать size_t в int, а потом обратно в socklen_t ? В amd64 size_t беззнаковый и вдвое шире, чем int. socklen_t нужна для совместимости, в силу того, что на IA-32 size_t 32х битное. socklen_t одинаковая везде, и гарантированно можно туда size_t запихать.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

79

drBatty пишет:
Peter пишет:

Совершенно не вижу в этом проблемы. Несколько байтов или несколько их десятков не жалко, а так единообразнее.

ну вы не видите, а я вижу.

Peter пишет:

И вообще обычный C требует, чтобы объявления располагались до исполнимых операторов.

бред.
можно даже в for(;;) переменные объявлять (хотя это уже ИМХО извращение).

https://en.wikipedia.org/wiki/Best_practice ИМХО объявлять переменные с самым меньшим временем жизни, насколько это возможно. Самое поганое — глобальные(ну или как у вас, те, что живут всё время работы). У вас же есть блоки {в таких скобках}, почему не объявить переменную там, если она нужна лишь внутри блока?

Некоторые переменные вообще не нужны, как эта ваша len. Вот зачем вам сначала кастовать size_t в int, а потом обратно в socklen_t ? В amd64 size_t беззнаковый и вдвое шире, чем int. socklen_t нужна для совместимости, в силу того, что на IA-32 size_t 32х битное. socklen_t одинаковая везде, и гарантированно можно туда size_t запихать.

Ну мало где что написано. Сейчас нет надобности бороться за каждую ячейку памяти, а мне удобнее, чтобы все объявления были в одном месте.
Вчера я в Debian искал, где определяется size_t, в прямом виде не нашёл. size_type вроде бы unsigned int.
Глобальных переменных я по возможности избегаю, но, если переменная требуется во многих подпрограммах в одном модуле,
то всё же удобнее сделать её глобальной.

Пётр.

Пётр.

80

Peter пишет:

Сейчас нет надобности бороться за каждую ячейку памяти

facepalm

Да при чём тут экономия?!  bu

Речь о совместимости и о надёжности.

Вам на это наплевать, потому ваш код тут работает, а там не работает.

Peter пишет:

а мне удобнее, чтобы все объявления были в одном месте.

вам может и удобнее, а компилятору приходится тащить их через весь код. Иногда они бьются на своём длинном и извилистом пути(из-за -O3).

Peter пишет:

Вчера я в Debian искал, где определяется size_t

зачем? Всё что вам нужно знать о size_t, то только то, что размер size_t достаточный для сохранения длинны _любого_ объекта в памяти. Всё. Сколько оно на самом деле — не имеет никакого значения, и ваш код обязан работать даже если size_t это char, и не бывает размера больше 127 байтов.

Для интерфейса с сокетами size_t не подходит, там свой стандарт, потому определён специальный тип socklen_t. И да, каст int ←→ size_t/socklen_t в общем случае UB, т.е. если ваш код отформатирует ваш HDD, в этом не будет ничего удивительного.

Peter пишет:

Глобальных переменных я по возможности избегаю, но, если переменная требуется во многих подпрограммах в одном модуле,
то всё же удобнее сделать её глобальной.

почитайте хотя бы про static.  Если "в одном модуле".

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

81

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

И опять же не понимаю, как размещение объявлений переменных в одном месте может
влиять на надёжность и переносимость, а также, как это они могуть побиться, пока подпрограмма
не дойдёт до выхода. Компилятор отведёт им место в каком надо сегменте и они там и останутся.

Пётр.

Пётр.

82

Peter пишет:

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

у вас так ВСЕГДА, потому что "не беспокоитесь".

Peter пишет:

И опять же не понимаю, как размещение объявлений переменных в одном месте может
влиять на надёжность и переносимость

ну во первых вы тип не можете задать нормально. Проблема как раз в том и заключается, что UB может как угодно и когда угодно проявиться. А может и НЕ проявится.

Peter пишет:

а также, как это они могуть побиться, пока подпрограмма
не дойдёт до выхода.

есть Over9000 причин для этого.

Peter пишет:

Компилятор отведёт им место в каком надо сегменте и они там и останутся.

ещё они в регистрах лежат, не только в памяти. И не факт, что эти регистры сохраняются во время сисколлов. Может сискол делает pusha, но 32х битную версию по недосмотру? А может и не делает. Кто знает? В amd64 множество "лишних" регистров, которых не было в IA-32, потому старый код про них не в курсе, и возможно их не сохраняет. Этот старый код может вызывать более новый код в ядре, который новые регистры использует. Может сам компилятор запутался, и что-то не так соптимизировал (кстати, с -O3 это бывает).

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

83

drBatty пишет:
Peter пишет:

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

у вас так ВСЕГДА, потому что "не беспокоитесь".

Для этого ещё нужен extern. А в присланных мною программах все переменные локальные.

Peter пишет:

И опять же не понимаю, как размещение объявлений переменных в одном месте может
влиять на надёжность и переносимость

ну во первых вы тип не можете задать нормально. Проблема как раз в том и заключается, что UB может как угодно и когда угодно проявиться. А может и НЕ проявится.

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

Peter пишет:

а также, как это они могуть побиться, пока подпрограмма
не дойдёт до выхода.

есть Over9000 причин для этого.

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

Peter пишет:

Компилятор отведёт им место в каком надо сегменте и они там и останутся.

ещё они в регистрах лежат, не только в памяти. И не факт, что эти регистры сохраняются во время сисколлов. Может сискол делает pusha, но 32х битную версию по недосмотру? А может и не делает. Кто знает? В amd64 множество "лишних" регистров, которых не было в IA-32, потому старый код про них не в курсе, и возможно их не сохраняет. Этот старый код может вызывать более новый код в ядре, который новые регистры использует. Может сам компилятор запутался, и что-то не так соптимизировал (кстати, с -O3 это бывает).

Насчёт регистров не моё дело. Если же с -O3 программа работает неправильно, то это опять же следствие ошибки
и она будет выявлена и исправлена.

Вот вы уже три страницы меня обличаете и даже, можно сказать, окатывате ушатами, а ошибку в присланной imit_cam.c
так и не нашли, хотя и напрягали всю силу своей мысли. Наверное, тут нужен Шерлок Холмс.

Пётр.

Пётр.

84

Peter пишет:

Для этого ещё нужен extern.

угу. Нужен.

Peter пишет:

А в присланных мною программах все переменные локальные.

проблема указателей в том, что они ВСЕГДА глобальные. И если у вас что-то возвращает/принимает указатель, то эта переменная всё равно видится где угодно. Даже если она и "локальная".

Peter пишет:

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

не правильно. Компилятор сам конечно переведёт, но проверять компилятор ничего не будет, полагается, что программист сам знает, что делает. В сишке можно что угодно перевести во что угодно, и никаких сообщений это не вызовет. Сообщения возникают лишь если компилятор в принципе не может что-то перевести. А если может, то как в ассемблере: есть просто тупо адрес, и тупо ВСЁ. Причём никого не волнует, если у вас ошибка, компилятор ничего проверять не будет.

Peter пишет:

Само собой ничего не бывает.

в сишке с UB — на каждом шагу.
Именно потому, многие люто, бешено ненавидят сишку.

Peter пишет:

Насчёт регистров не моё дело. Если же с -O3 программа работает неправильно, то это опять же следствие ошибки
и она будет выявлена и исправлена.

исправляйте.

Peter пишет:

Вот вы уже три страницы меня обличаете и даже, можно сказать, окатывате ушатами, а ошибку в присланной imit_cam.c
так и не нашли, хотя и напрягали всю силу своей мысли. Наверное, тут нужен Шерлок Холмс.

в вашем коде копаться — дело не очень приятное.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

85

Я же сказал, что и g++ скомпилировал это без сообщений.
рп
Таж же только main, других модулей и подпрограмм нет, какие могут быть проблемы хоть с переменными,
хоть с указателями? Пока программа работает, указатель остаётся актуальным. Например, в реальной
программе на Qt, с которой может связываться этот imit_cam.c, указатели на массивы передаются из
одного потока в другой и всё это работает без сбоев.

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

Я удивляюсь, как можно относиться с неприязнью к C. Это удобный и естественный язык, не случайно ведь
именно на нём написана Linux.

Код простой, и у вас же вариант с отступами. Там всего три вызова функций, последний в цикле.
Ничего сложного там нет, всё построено из найдённых примеров. Наверное, это всё же порок Ubuntu,
в ней вон и QTimer интервалы выдерживает неточно.

Пётр.

Пётр.

86

Peter пишет:

Я же сказал, что и g++ скомпилировал это без сообщений.
рп

я же сказал, что отсутствие сообщений ни о чём не говорит.

В сишке к сожалению всего один самый тупой static_cast, который указатели в x86 совершенно тупо кастует, причём ошибок не пишет, даже если кастовать (тёплое*) в (мягкое*).

А специальный тип void* так вообще во что угодно неявно кастуется.

Peter пишет:

Для входных аргументов это не важно, они могут быть заданы и числами

важно.

Peter пишет:

Я удивляюсь, как можно относиться с неприязнью к C. Это удобный и естественный язык, не случайно ведь
именно на нём написана Linux.

просто вы ещё с UB не сталкивались.

Peter пишет:

Наверное, это всё же порок Ubuntu

угу. Напомнило "во всём виновата Windows".

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

87

void* для этого и предназначен.
Конечно, я бы не стал пытаться вместо double передавать int, но вместо переменной типа double можно подставить число этого же типа.
Конечно, Ubuntu, иначе как объяснить, что в ней в Qt timeout таймера вместо 4000 миллисекунд составляет 4063?
А в Debian в пределах гранулированности.
Сдаётся мне, что вы руководствуетесь тем фактом, что "метода военная действие наступательное всегда действию оборонительному
предпочитает", вот вы и стараетесь сбить меня с одних позиций, будучи не в силах взять другие.
Т.е. я так и не уловил, почему в Ubuntu наличие gettimeofday() в тексте влияет на прдшествующую её вызову sendto().

Пётр.

Пётр.

88

Peter пишет:

void* для этого и предназначен.

угу. Потому что без void* невозможно создать полиморфную функцию. А с void* можно, но никто не может гарантировать правильность типа. Т.е. правильность работы держится буквально на честном слове. Да, вы торжественно обещаете, что будете всё делать по правилам. Но не делаете.

Peter пишет:

Конечно, Ubuntu, иначе как объяснить, что в ней в Qt timeout таймера вместо 4000 миллисекунд составляет 4063?

я без понятия. Это проблема Qt, при чём тут Ubuntu?

Peter пишет:

Сдаётся мне, что вы руководствуетесь тем фактом, что "метода военная действие наступательное всегда действию оборонительному
предпочитает", вот вы и стараетесь сбить меня с одних позиций, будучи не в силах взять другие.

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

Я вот не понимаю, почему нельзя перед sendto сделать отладочную печать, выводя все параметры в удобочитаемом виде? Ну раз оно пишет EINVAL, значит параметры испорчены, так? Вот и узнаем, КАКОЙ параметр испорчен. Либо докажем, что у нас всё хорошо, а быдлокодеры Марка испортили няшную glibc.

Peter пишет:

Т.е. я так и не уловил, почему в Ubuntu у вас наличие gettimeofday() в тексте влияет на прдшествующую её вызову sendto().

//fixed

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

89

Конкретных ошибок вы не назвали. Возможно, их там и нет, иначе вы бы их сразу заметили.
Однако, если успею, попробую уточнить ситуацию.

Пётр.

Пётр.

90

Благодаря вашей настойчивости я всё же нашёл у себя ошибку в imit_cam.c.
Я одновременно сделал, чтобы 3-м параметром в recvfrom() и sendto() было не число и не переменная int,
а переменная типа size_t, а также, чтобы последнему аргументу, который правильно был переменной типа socklen_t,
перед вызовом функции заведомо присваивалось правильное значение. А до этого я полагался на то, что правильное
перед значение перед вызовом sendto() будет там и после вызова recvfrom(), но я не инициализровал его перед вызовом
recvfrom(), хотя обязан был это сделать. Так что порок оказался у меня, а Ubuntu я, выходит, оклеветал.

Пётр.

Пётр.