поведение getsockname, когда name = null

У меня есть код в Windows, который вызывает getsockname следующим образом:

getsockname(*x,NULL,0)

третий параметр (namelen) является параметром IN \ Out и содержит размер буфера имени в байтах. По возвращении параметр namelen содержит фактический размер в байтах параметра name.
Теперь мой вопрос: что произойдет, если имя равно нулю, а namelen равно нулю? Я видел, что в linux, если имя NULL, namelen игнорируется, но MSDN ничего не упоминает об этом случае. ,
Ссылка MSDN Вот
ссылка IBM для Linux Вот

заранее спасибо

1

Решение

В вашем коде вы передали ноль для третьего параметра.

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

Согласно документации MSDN и Linux, функция должна вернуть -1 и установить errno в EFAULT (или WSAGetLastError to WSAEFAULT на в окнах розетки). Это определяется как «Использование параметров name и namelen, как указано, приведет к попытке доступа к хранилищу вне адресного пространства вызывающего».

Однако это не является частью спецификации Posix, и я не читаю это как требующий Функция проверки адресов — только то, что она может. Другими словами, по крайней мере, в Posix это неопределенное поведение. Это означает, что все может случиться.

В Linux вы говорите, что заметили, что два параметра игнорируются, если передается значение null. Я подозреваю, что ваш код не проверяет возвращаемое значение, которое, вероятно, будет -1 с errno установлен в EFAULT,

Функции Posix не генерируют исключения. Вы должны проверить код возврата, возможно, что-то вроде этого:

int result = getsockname(*x,NULL,0);
if(result){
/*Failed - handle here*/
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]