c - getsockname() c 没有设置值

标签 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 失败了?

最佳答案

在调用getsockname() 之前,您必须将len 初始化为允许的最大大小(即结构的大小)。此长度值由调用修改为包含实际长度。

您还应确保已绑定(bind)套接字描述符。您的测试似乎表明它是针对已建立的 session ,但代码不清楚,因为它只包含一个 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

关于c - getsockname() c 没有设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20941027/

相关文章:

c - 短路和可读性

c - 这些表达式做了什么 ii = (char *)&i ; aa= (char *)&a ;在下面的程序中?

c - 释放动态结构不会释放内存

java - 如何最好地将二进制文件从 Android 发送到 PC 上的 Python 脚本?

web-services - 为什么 Railway IS 不被视为 RESTful Web 服务器?

excel - 在 Excel VBA 中, "IsNull()"和 "var = Null"有什么区别?

java - 如何从二维数组中删除空值?

c - 如何有效地将两个16位字逐位组合成一个32位字?

windows - 通过网络运行 VB6 exe - 它会在执行期间制作本地副本吗?

sql-server - SQL 服务器 : Convert nulls into values when inserting fails - can I force this?