当前位置:  开发笔记 > 编程语言 > 正文

Segfault(可能由于铸造)

如何解决《Segfault(可能由于铸造)》经验,为你挑选了1个好方法。

我通常不会为sigsegv错误转到stackoverflow,但我现在已经尽力使用我的调试器了.

完成该功能后,将抛出分段错误错误.我忽略了什么想法?我怀疑这是因为将sockaddr投射到sockaddr_in,但我无法在那里发现任何错误.(删除该行可以摆脱seg错误 - 但我知道这可能不是这里的根本原因).

// basic setup
int sockfd;
char str[INET_ADDRSTRLEN];
sockaddr* sa;
socklen_t* sl;
struct addrinfo hints, *servinfo, *p;
int rv;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;

// return string
string foundIP;

// setup the struct for a connection with selected IP
if ((rv = getaddrinfo("4.2.2.1", NULL, &hints, &servinfo)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
    return "1";
}

// loop through all the results and make a socket
for(p = servinfo; p != NULL; p = p->ai_next) {
    if ((sockfd = socket(p->ai_family, p->ai_socktype,
            p->ai_protocol)) == -1) {
        perror("talker: socket");
        continue;
    }

    break;
}

if (p == NULL) {
    fprintf(stderr, "talker: failed to bind socket\n");
    return "2";
}

// connect the UDP socket to something
connect(sockfd, p->ai_addr, p->ai_addrlen); // we need to connect to get the systems local IP

// get information on the local IP from the socket we created
getsockname(sockfd, sa, sl);

// convert the sockaddr to a sockaddr_in via casting
struct sockaddr_in *sa_ipv4 = (struct sockaddr_in *)sa;

// get the IP from the sockaddr_in and print it
inet_ntop(AF_INET, &(sa_ipv4->sin_addr), str, INET_ADDRSTRLEN);
printf("%s\n", str);

// return the IP
return foundIP;

}



1> CB Bailey..:

它看起来不像你初始化指针sa指向有效sockaddr(或sockaddr_in)对象.

如果你更换

sockaddr* sa;

sockaddr addr;

和替换的所有使用sa&addr你应该在更好的状态.

同样的情况也是如此sl.至少根据用于我的getsockname文档中的socklen_t*参数需要在有效点socklen_t的地址缓冲区的字节数初始化为大小的对象.

例如

socklen_t slen = sizeof addr;

并使用&slen而不是sl.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有