我通常不会去 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/