【问题标题】:Segmentation fault 11 - network program [closed]分段错误 11 - 网络程序 [关闭]
【发布时间】:2013-01-01 06:06:20
【问题描述】:

这是我第一次尝试编写网络程序。它编译没有问题,但是当我运行它时,它给了我一个“分段错误 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;
}

【问题讨论】:

  • 您需要找出失败的确切行,使用printf 等。这就是调试的工作原理。
  • 您不是可能失败的错误检查函数,例如getaddrinfo()recv()。如果getaddrinfo() 失败,则很容易导致分段错误。
  • @JonathanLeffler 是啊,我对懒惰感到内疚。我想快速写一些东西来测试一下。谢谢你的信息
  • 问题是如果你跳过错误检查,你会得到崩溃。这实际上使该过程比首先编写错误检查要慢。确保你有一个好的错误报告库,以便于报告错误。
  • 首先,检查是否发生分段错误,只需使用gdb运行您的程序。

标签: c sockets networking segmentation-fault


【解决方案1】:

段错误发生在第一个bind 时,因为getaddrinfo 返回错误res 结构无效。

getaddrinfo返回的错误是

EAI_SOCKTYPE

不支持请求的套接字类型。例如,如果 hints.ai_socktype 和 hints.ai_protocol 不一致(例如,分别为 SOCK_DGRAM 和 IPPROTO_TCP),就会发生这种情况。

您设置了hints.ai_protocol = AI_PASSIVE,这是不正确的。手册说:

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

所以如果你想获取任何协议,你应该将它设置为 0。

这虽然消除了segfault,但是程序很乱而且不正确。

还要注意:

您正在使用侦听器套接字进行发送和接收。您应该使用accept 返回的套接字,即代码中的new_fdsendrecv,因为这是在它们之间建立的通道。

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

看看这个可能会帮助您快速进入套接字:http://beej.us/guide/bgnet/

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多