Я пытаюсь получить локальный IP-адрес, используемый для установления соединения. Однако по какой-то причине я не могу использовать getsockname, потому что он никогда не устанавливает какие-либо данные в моем sockaddr.getsockname() c не заданное значение
int fd = socket(/* params */);
int len;
struct sockaddr_in _self;
/* Connection code, I know the connection succeeds and I've tested */
memset(&_self, 0, sizeof (struct sockaddr_in));
getsockname(fd, (struct sockaddr *) &_self, &len);
printf("%s\n", inet_ntoa(_self.sin_addr);
Однако, когда программа получает PRINTF, она всегда заканчивается из-за «ошибки Segmentation», который я думаю, когда он пытается получить доступ к памяти, что он не установил (я правильно в этом предположении ?) Если да, значит ли это, что getsockname терпит неудачу?
вы можете проверить результат getsockanme (0: sucess, -1 error и errno). – mpromonet
@mpromonet Я только что проверил, он возвращает 0 и errno также 0 – dreadiscool
На странице man для getsockname говорится: Аргумент addrlen должен быть инициализирован, чтобы указать объем пространства (в байтах), на который указывает addr. Это не похоже, что len инициализируется в вашем коде. Не уверен, что это связано с вашей проблемой. – Quercus