У меня есть код в Windows, который вызывает getsockname следующим образом:
getsockname(*x,NULL,0)
третий параметр (namelen) является параметром IN \ Out и содержит размер буфера имени в байтах. По возвращении параметр namelen содержит фактический размер в байтах параметра name.
Теперь мой вопрос: что произойдет, если имя равно нулю, а namelen равно нулю? Я видел, что в linux, если имя NULL, namelen игнорируется, но MSDN ничего не упоминает об этом случае. ,
Ссылка MSDN Вот
ссылка IBM для Linux Вот
заранее спасибо
В вашем коде вы передали ноль для третьего параметра.
Третий параметр не может быть нулевым, в соответствии со спецификацией, он должен быть указателем на целое число, дающее длину второго параметра, а при выводе — фактический размер адреса. Проходящий ноль делает не означает, что вы говорите, что хранилище не выделено, это означает, что вы говорите, что не передали информацию и нигде не записали выходное значение.
Согласно документации 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*/
}
Других решений пока нет …