Последовательные вызовы к recvfrom () теряют данные?

Как вы можете определить, какие даты должны быть 2012, а какие - 1912?

Если ваша переменная действительно является переменной даты SAS, то век уже был 2000, вы просто не могли увидеть ее раньше, потому что ваш использовали формат отображения, который не показывает век. Вы можете использовать intnx() для регулировки значения.

want = intnx('year',have,-100,'same');

Если вы конвертируете строки в даты, вы можете использовать опцию YEARCUTOFF, чтобы интерпретировать 12 как 1912 вместо 2012.

857   %let optsave=%sysfunc(getoption(yearcutoff));
858   %put &=optsave;
OPTSAVE=1926
859   %put %sysfunc(inputn(24/12/12,ddmmyy8),date9);
24DEC2012
860   options yearcutoff=1912;
861   %put %sysfunc(inputn(24/12/12,ddmmyy8),date9);
24DEC1912
862   options yearcutoff=&optsave;
7
задан poundifdef 24 March 2009 в 01:03
поделиться

2 ответа

От recv (2) страница справочника:

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

Это - то, на что это похоже, происходит с Вами.

Вы должны иметь буфер максимального размера сообщения и считать ту сумму. Вы будете только для чтения, одна датаграмма и длина будут возвращены. Можно затем проанализировать длину от передней стороны буфера и проверить его против того, что возвратил recvfrom (2).

8
ответ дан 7 December 2019 в 01:26
поделиться

Другой метод - выполнить фиктивный recvfrom с флагом MSG_PEEK. Хотя возвращаемый размер такой же, как размер вашего буфера (или больше), возьмите буфер большего размера и повторите попытку. Затем снова выполните recvfrom (без флага MSG_PEEK), чтобы удалить сообщение из буфера UDP.

Но, конечно, это довольно неэффективно и не должно выполняться, если вы можете просто определить максимальный размер пакета.

2
ответ дан 7 December 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: