Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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 分段故障11-网络程序_C_Sockets_Networking_Segmentation Fault - Fatal编程技术网

C 分段故障11-网络程序

C 分段故障11-网络程序,c,sockets,networking,segmentation-fault,C,Sockets,Networking,Segmentation Fault,这是我第一次尝试编写网络程序。它编译没有问题,但当我运行它时,它会给我一个“分段错误11”。我希望有人能告诉我代码中的什么可能导致这个问题 我是C的新手 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <netdb.h> #include <

这是我第一次尝试编写网络程序。它编译没有问题,但当我运行它时,它会给我一个“分段错误11”。我希望有人能告诉我代码中的什么可能导致这个问题

我是C的新手

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>

int main()
{   
    ////////////      GETADDRINFO   \\\\\\\\\\\\\\\\

    struct addrinfo hints, *res;
    memset(&hints, 0 , sizeof hints);

    hints.ai_family     = AF_UNSPEC;    //define the 'hints' strucure
    hints.ai_socktype   = SOCK_STREAM;  //define the 'hints' strucure
    hints.ai_protocol   = AI_PASSIVE;   //define the 'hints' strucure

    char *ipaddr = "127.0.0.1";
    getaddrinfo(ipaddr, "ftp", &hints, &res);

    //////////////     SOCKET     \\\\\\\\\\\\\\\\

    int sock = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in info;
    int bnd  = bind( sock , res->ai_addr, res->ai_addrlen);

    info.sin_family         = AF_INET;
    info.sin_port           = htons(10000);
    info.sin_addr.s_addr    = INADDR_ANY;   
    bzero(&(info.sin_zero),8); 


    ///////////////    CONNECT   \\\\\\\\\\\\\\\\\\\\\\ 

    int conct = connect( sock, res->ai_addr, res->ai_addrlen);

    //////////////     LISTEN     \\\\\\\\\\\\\\\\\\

    int lstn = listen( sock , 4 );

    //////////////    ACCEPT    \\\\\\\\\\\\\\\\\\\\\\\

    int new_fd;
    struct sockaddr_storage client_addr;
    socklen_t addr_size;
    addr_size = sizeof(client_addr);
    new_fd = accept(sock, (struct sockaddr *)&client_addr, &addr_size);

    /////////////////   SEND   \\\\\\\\\\\\\\\\\\\\\\

    char *msg = "HI!";
    int len, bytes_sent;
    len = strlen(msg);
    bytes_sent = send(sock, msg, len, 0);

    //////////////// RECEIVE \\\\\\\\\\\\\\\\\

    char burr[254];
    int cat = sizeof(burr);

    recv( sock, burr , cat , 0 );

    printf("%s", burr);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{   
////////////GETADDRINFO\\\\\\\\\\\\\\\\
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hints.ai_family=AF_unsec;//定义“hints”结构
hints.ai_socktype=SOCK_STREAM;//定义“hints”结构
hints.ai_protocol=ai_PASSIVE;//定义“hints”结构
char*ipaddr=“127.0.0.1”;
getaddrinfo(ipaddr、ftp、提示和res);
//////////////插座\\\\\\\\\\\\\\\\
intsock=socket(AF_INET,sock_STREAM,0);
信息中的结构sockaddr_;
int bnd=bind(sock,res->ai_addr,res->ai_addrlen);
info.sin_family=AF_INET;
info.sin_port=htons(10000);
info.sin\u addr.s\u addr=INADDR\u ANY;
bzero(&(信息单零),8);
///////////////连接
int conct=connect(sock,res->ai_addr,res->ai_addrlen);
//////////////听\\\\\\\\\\\\\\\\\\
int lstn=监听(sock,4);
//////////////接受\\\\\\\\\\\\\\\\\\\\\\\
int new_fd;
结构sockaddr\u存储客户端\u addr;
袜子尺寸;
地址大小=sizeof(客户地址);
new_fd=accept(sock,(struct sockaddr*)和client_addr,&addr_size);
/////////////////发送\\\\\\\\\\\\\\\\\\\\\\
char*msg=“你好!”;
int len,发送的字节数;
len=strlen(msg);
字节发送=发送(sock,msg,len,0);
////////////////接收\\\\\\\\\\\\\\\\\
炭毛刺[254];
int cat=尺寸(毛刺);
recv(短袜、毛刺、cat,0);
printf(“%s”,毛刺);
返回0;
}

segfault发生在第一次绑定时,因为
getaddrinfo
返回错误,因此
res
结构无效

getaddrinfo
返回的错误为

EAI_类型

不支持请求的套接字类型。例如,如果hints.ai_socktype和hints.ai_协议不一致(例如,分别为SOCK_DGRAM和IPPROTO_TCP),则可能发生这种情况

您在
hints.ai_protocol=ai_PASSIVE
中设置了错误。手册上说:

ai_协议此字段指定返回套接字地址的协议。在此字段中指定0表示getaddrinfo()可以返回具有任何协议的套接字地址

因此,如果要获取任何协议,应将其设置为0

这虽然消除了SEGFULT,但程序混乱且不正确

还应注意:

您正在使用侦听器套接字发送和接收。您应该使用
accept
返回的套接字,该套接字在代码中是
new\u fd
,用于
send
recv
之间建立的通道

您已经定义并初始化了结构
info
,但从未使用过它


看看这个,这可能会帮助您快速进入套接字:

segfault发生在第一次绑定时,因为
getaddrinfo
返回此错误
res
结构无效

getaddrinfo
返回的错误为

EAI_类型

不支持请求的套接字类型。例如,如果hints.ai_socktype和hints.ai_协议不一致(例如,分别为SOCK_DGRAM和IPPROTO_TCP),则可能发生这种情况

您在
hints.ai_protocol=ai_PASSIVE
中设置了错误。手册上说:

ai_协议此字段指定返回套接字地址的协议。在此字段中指定0表示getaddrinfo()可以返回具有任何协议的套接字地址

因此,如果要获取任何协议,应将其设置为0

这虽然消除了SEGFULT,但程序混乱且不正确

还应注意:

您正在使用侦听器套接字发送和接收。您应该使用
accept
返回的套接字,该套接字在代码中是
new\u fd
,用于
send
recv
之间建立的通道

您已经定义并初始化了结构
info
,但从未使用过它


看看这一点,这可能会帮助您快速进入套接字:

您需要使用
printf
等工具来确定失败的确切位置。这就是调试的工作方式。您不会检查可能失败的函数,例如
getaddrinfo()
recv()
。如果
getaddrinfo()
失败,它很容易解释分段错误。@JonathanLeffler yeeeaah,我犯了懒惰罪。我想写一些快速的东西来测试它。感谢您提供的信息。问题是,如果您跳过错误检查,就会导致崩溃。这实际上会使过程比最初编写错误检查慢。确保你有一个好的错误报告库,以便于报告错误。首先,检查是否发生了分段错误,只需使用
gdb
运行你的程序。你需要使用
printf
等工具找出失败的确切行。这就是调试的工作方式。你不是在检查可能失败的错误函数,例如
getaddrinfo()
recv()
。如果
getaddrinfo()
失败,它很容易解释分段错误。@JonathanLeffler yeeeaah,我犯了懒惰罪。我想写一些快速的东西来测试它。感谢您提供的信息。问题是,如果您跳过错误检查,就会导致崩溃。这实际上会使过程比最初编写错误检查慢。确保你的身体健康