C空指针检查在ai_下一个链表中失败
背景:我将介绍如何使用C套接字侦听和接受传入连接 问题:我遇到的问题是在遍历要侦听的地址链接列表时出现分段错误。我会检查下一个结构是否为null,但这不起作用 我尝试的内容:在这段代码和我之前编写的工作示例之间,我只能分辨出一个区别,即这些地址是我自己的计算机上的地址,而不是另一台主机上的地址。我也查看了getaddrinfo的手册页,并且尽可能地遵循示例实现C空指针检查在ai_下一个链表中失败,c,pointers,getaddrinfo,C,Pointers,Getaddrinfo,背景:我将介绍如何使用C套接字侦听和接受传入连接 问题:我遇到的问题是在遍历要侦听的地址链接列表时出现分段错误。我会检查下一个结构是否为null,但这不起作用 我尝试的内容:在这段代码和我之前编写的工作示例之间,我只能分辨出一个区别,即这些地址是我自己的计算机上的地址,而不是另一台主机上的地址。我也查看了getaddrinfo的手册页,并且尽可能地遵循示例实现 #包括 #包括 #包括 #包括 #包括 #包括 #定义MYPORT“6161” int main(){ 结构addrinfo提示,*re
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_family=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
我发现了问题
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#define MYPORT "6161"
int main() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);
struct addrinfo *addr;
for (addr = res; addr != NULL; addr = addr->ai_next) {
printf("Here's one addr!");
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_family=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
这是你的密码
这是正确的代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#define MYPORT "6161"
int main() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);
struct addrinfo *addr;
for (addr = res; addr != NULL; addr = addr->ai_next) {
printf("Here's one addr!");
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_flags=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
您只编写了两次ai_family
,从而将ai_PASSIVE
分配给hints.ai_family
而不是hints.ai_flags
我尝试了更正后的代码,效果很好。我发现了问题
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#define MYPORT "6161"
int main() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);
struct addrinfo *addr;
for (addr = res; addr != NULL; addr = addr->ai_next) {
printf("Here's one addr!");
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_family=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
这是你的密码
这是正确的代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#define MYPORT "6161"
int main() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);
struct addrinfo *addr;
for (addr = res; addr != NULL; addr = addr->ai_next) {
printf("Here's one addr!");
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_flags=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
您只编写了两次ai_family
,从而将ai_PASSIVE
分配给hints.ai_family
而不是hints.ai_flags
我尝试了更正后的代码,效果很好。我第一眼想到的唯一一件事是
getaddrinfo
可能会失败(我不知道为什么),因此不会更改res
。请检查getaddrinfo
的返回值,以及调用getaddrinfo
后res是否发生变化?编辑:我是对的:执行代码会出现以下错误:*不支持ai_系列(我使用gai_strerror进行检查)。我正在调查它…我假设在发生错误的情况下,getaddrinfo
不会触及res
poiner。在调用之前,您需要自己将其初始化为NULL
,或者您需要注意返回值(您应该始终这样做!)。我建议使用int err=getaddrinfo(NULL、MYPORT、提示和res)代码>,然后是if(err==0)。。。else fprintf(标准,“%s\n”,ai_strerror(err))
我第一眼想到的唯一一件事是getaddrinfo
可能会失败(但我不知道为什么),因此不会改变res
。请检查getaddrinfo
的返回值,以及调用getaddrinfo
后res是否发生变化?编辑:我是对的:执行代码会出现以下错误:*不支持ai_系列(我使用gai_strerror进行检查)。我正在调查它…我假设在发生错误的情况下,getaddrinfo
不会触及res
poiner。在调用之前,您需要自己将其初始化为NULL
,或者您需要注意返回值(您应该始终这样做!)。我建议使用int err=getaddrinfo(NULL、MYPORT、提示和res)代码>,然后是if(err==0)。。。else fprintf(标准,“%s\n”,ai_strerror(err))代码>