我正在尝试获取用于建立连接的本地IP。但是,出于某种原因,我无法使用getsockname,因为它从不在我的sockaddr中设置任何数据。
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时,它总是由于“分段错误”而终止,我认为当它试图访问它没有设置的内存时(我在这个假设中是否正确?)如果是这样的话,这是否意味着getsockname失败?
答案 0 :(得分:2)
在调用len
之前,您必须将getsockname()
初始化为允许的最大大小(即结构的大小)。该长度值是通过调用来修改的,以包含实际长度。
您还应确保已绑定套接字描述符。您的测试似乎表明它适用于已建立的会话,但代码不清楚,因为它只包含socket()
电话。
作为基线,请使用以下程序:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main (void) {
int fd = socket (AF_INET, SOCK_STREAM, 0);
struct sockaddr_in _self;
int len = sizeof (_self);
memset (&_self, 0, len);
bind(fd, (struct sockaddr *) &_self, len);
memset (&_self, 42, len);
getsockname (fd, (struct sockaddr *) &_self, &len);
printf ("%s\n", inet_ntoa (_self.sin_addr));
return 0;
}
按预期输出0.0.0.0
。