c++ - 段错误(可能是由于转换)

标签 c++ segmentation-fault

我通常不会去 stackoverflow 寻找 sigsegv 错误,但我现在已经用我的调试器做了我能做的一切。

函数完成后抛出段错误。我忽略了什么想法?我怀疑这是由于将 sockaddr 转换为 sockaddr_in,但我在那里找不到任何错误。 (删除该行可以消除段错误——但我知道这可能不是根本原因)。

// 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;

最佳答案

看起来您从未将指针 sa 初始化为指向有效的 sockaddr(或 sockaddr_in)对象。

如果你更换

sockaddr* sa;

sockaddr addr;

并将 sa 的所有使用替换为 &addr 您应该处于更好的状态。

sl也是如此。至少根据我的 getsockname 的文档,socklen_t* 参数需要指向一个有效的 socklen_t 对象,该对象初始化为地址缓冲区的字节大小。

例如

socklen_t slen = sizeof addr;

并使用 &slen 代替 sl

关于c++ - 段错误(可能是由于转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3026858/

相关文章:

c++ - HttpAddUrl 因 ERROR_SHARING_VIOLATION (32L) 而失败

c++ - 尝试使用类文件,出现 "undefined reference to ` WinMain@1 6'"错误

c++ - 编写虚拟网络摄像头?

c - 段错误没有发生在应该发生的地方

python - Python中使用GRIP处理图像的Segmentation Fault

c++ - OpenCV 筛选/冲浪/Orb : drawMatch function is not working well

c++ - (string&)string() 和 (string& )""作为默认参数有什么区别?

c - 从 C 文本文件中提取随机单词时出现段错误

c - 您如何定位和修复段错误?

c - 将 char* 解析为标记时出现段错误