getsockname()c没有设置值

时间:2014-01-06 00:24:30

标签: c networking null

我正在尝试获取用于建立连接的本地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失败?

1 个答案:

答案 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