Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C inet_ntop函数SEGFULT(可能是强制转换错误)_C_Sockets - Fatal编程技术网

C inet_ntop函数SEGFULT(可能是强制转换错误)

C inet_ntop函数SEGFULT(可能是强制转换错误),c,sockets,C,Sockets,我试图了解如何通过插座连接互联网。(但我卡住了。原因是SEGFULT。)我不明白为什么这个代码给出SEGFULT:S你能帮我吗 int main() { int status; WSADATA wsa; struct addrinfo hints ,*servinfo; struct sockaddr_in *servSock; char *ip4; /**initialization*/ WSAStartup(MAKEWORD(2 ,0

我试图了解如何通过插座连接互联网。(但我卡住了。原因是SEGFULT。)我不明白为什么这个代码给出SEGFULT:S你能帮我吗

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^^^^^)

这可能会起作用:

unsigned char ip4buf[4];
memcpy(ip4buf,(struct sockaddr_in *)(servinfo->ai_addr)->sin_addr,4);
...
inet_ntop(AF_INET,(void *) (&ip4buf)ip4,INET_ADDRSTRLEN);
这可能会起作用:

unsigned char ip4buf[4];
memcpy(ip4buf,(struct sockaddr_in *)(servinfo->ai_addr)->sin_addr,4);
...
inet_ntop(AF_INET,(void *) (&ip4buf)ip4,INET_ADDRSTRLEN);

你能检查一下&(servSock->sin\u addr)是否有效。

你能检查一下&(servSock->sin\u addr)是否有效。

我现在拿到了。当您使用windows api时
gai_strerror(int errno)
使其不稳定,我们应该使用
WSAGetLastError()
函数。(gai_strerror更改了我的servinfo指针数据-在测试了我的代码很多次后,我得到了这个结果。)&msdn建议使用WSAGetLastError进行线程安全使用


Thnx寻求任何帮助这是我对这个问题的注释。

我现在明白了。当您使用windows api时
gai_strerror(int errno)
使其不稳定,我们应该使用
WSAGetLastError()
函数。(gai_strerror更改了我的servinfo指针数据-在测试了我的代码很多次后,我得到了这个结果。)&msdn建议使用WSAGetLastError进行线程安全使用


Thnx寻求任何帮助这是我对这个问题的注释。

inet\u ntop(AF\u inet,&(servSock->sin\u addr),ip4,inet\u ADDRSTRLEN);我不知道少了哪一个
int af-->af_INET
const void*restrict src-->&(servSock->sin_addr)
char*restrict dst-->ip4
socklen\u t size-->INET_ADDRSTRLEN
不是吗@Jevac事实上我不明白代码(我是新手)你能解释一下吗?实际上可能有一个更简单的解决方案:因为你有*servInfo,你应该使用mallocwasnt getaddrinfo(…)为它分配内存,这样做?现在不能编译你的代码;双重检查的一种方法是将ip地址以二进制格式复制到缓冲区firstinet\u ntop(AF\u INET,&(servSock->sin\u addr),ip4,INET\u ADDRSTRLEN);我不知道少了哪一个
int af-->af_INET
const void*restrict src-->&(servSock->sin_addr)
char*restrict dst-->ip4
socklen\u t size-->INET_ADDRSTRLEN
不是吗@Jevac事实上我不明白代码(我是新手)你能解释一下吗?实际上可能有一个更简单的解决方案:因为你有*servInfo,你应该使用mallocwasnt getaddrinfo(…)为它分配内存,这样做?现在不能编译你的代码;双重检查的一个方法是首先将ip地址以二进制格式复制到缓冲区。实际上,当我尝试时,这段代码可以正常工作,但我试图得到一个更简短、更容易理解的版本<代码>状态=inet\u ntop(AF\u inet,&((struct sockaddr\u in*)(servinfo->ai\u addr))->sin\u addr,ip4,inet\u ADDRSTRLEN但当我尝试使用该代码时,我得到了不可访问的位置:实际上,当我尝试使用该代码时,该代码工作正常,但我尝试获得一个更短、更容易理解的版本<代码>状态=inet\u ntop(AF\u inet,&((struct sockaddr\u in*)(servinfo->ai\u addr))->sin\u addr,ip4,inet\u ADDRSTRLEN但当我尝试使用该代码时,我得到了不可访问的位置:S如果你想调试它:)当我使用
和((struct sockaddr_in*)(servinfo->ai_addr))->sin_addr
时,我得到了这个监视结果&我从这些结果中了解到,当我使用
servSock=(struct sockaddr\u in*)(servinfo->ai\u addr)时,我没有得到一些东西代码如果你想调试它:)当我使用
和((struct sockaddr_in*)(servinfo->ai_addr))->sin_addr
时我得到了这个监视结果&当我使用
和(servSock->sin_addr)
时我从这些结果中了解到,当我使用
servSock=(struct sockaddr_in*)时我没有得到一些东西(servinfo->ai_addr);
code