我试图了解如何连接互联网槽插座。(但我卡住了。因为段错误。)我不明白为什么这段代码给出了段错误:你可以帮我吗。
int main()
{
int status;
WSADATA wsa;
struct addrinfo hints ,*servinfo;
struct sockaddr_in *servSock;
char *ip4;
/**initialization*/
WSAStartup(MAKEWORD(2 ,0) ,&wsa);
memset((void *)&hints ,NULL ,sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
ip4 = (char *)malloc(sizeof(char)*INET_ADDRSTRLEN);
/**End of initialization*/
status = getaddrinfo("www.google.com",DEF_PORT,&hints,&servinfo);
checkErr("serv info" ,status ,0 ,equal ,gai_strerror);
servSock = (struct sockaddr_in *)(servinfo->ai_addr);
status = inet_ntop(AF_INET ,&(servSock->sin_addr) ,ip4,INET_ADDRSTRLEN);
checkErr("ntop" ,status ,NULL ,nEqual ,gai_strerror);
printf("IPv4 : %s",ip4);
free(ip4);
WSACleanup();
}
代码在inet_ntop行爆炸(idk为什么,导致im noob ^^)
答案 0 :(得分:1)
您可以查看&(servSock-> sin_addr)是否有效。
答案 1 :(得分:0)
这可能有效:
unsigned char ip4buf[4];
memcpy(ip4buf,(struct sockaddr_in *)(servinfo->ai_addr)->sin_addr,4);
...
inet_ntop(AF_INET,(void *) (&ip4buf)ip4,INET_ADDRSTRLEN);
答案 2 :(得分:0)
我现在明白了。当你使用Windows API时。 gai_strerror(int errno)
使它变得不稳定,我们应该使用WSAGetLastError()
函数。(gai_strerror改变了我的servinfo指针数据 - 经过多次测试我的代码后得到了这个结果。)& msdn建议使用WSAGetLastError进行线程安全使用。
Thnx可以提供任何帮助。 &安培;这是我对这个问题的说明。