c - 段错误 11 - 网络程序

标签 c sockets networking segmentation-fault

<分区>

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

最佳答案

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

getaddrinfo返回的错误是

EAI_SOCKTYPE

The requested socket type is not supported. This could occur, for example, if hints.ai_socktype and hints.ai_protocol are inconsistent (e.g., SOCK_DGRAM and IPPROTO_TCP, respectively).

您在 hints.ai_protocol = AI_PASSIVE 中设置的是不正确的。手册说:

ai_protocol This field specifies the protocol for the returned socket addresses. Specifying 0 in this field indicates that socket addresses with any protocol can be returned by getaddrinfo().

所以如果你想得到任何协议(protocol),你应该把它设置为0。

这虽然消除了段错误,但程序困惑且不正确。

还要注意:

您正在使用监听器套接字发送和接收。您应该使用 accept 返回的套接字,即 new_fd 在您的代码中进行 sendrecv 因为那是之间建立的 channel 。

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

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

关于c - 段错误 11 - 网络程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14108238/

相关文章:

c# - 在局域网外使用 TCP

sockets - 使用 IN6ADDR_SETV4MAPPED 和双堆栈套接字

networking - TCP ACK 中的校验和 0xDEAD

C 文件 I/O 问题

c - 如何在不使用 for 循环的情况下获取 char * 变量的大小?

Linux: proc/net/sockstat tcp mem 越来越大

networking - docker 撰写db2-express C的问题

python - 如何使用IPy确定IP地址是否在白名单中?

python - 使用 py2exe 构建带有扩展的 python 程序

c - 如何让 gcc 警告未知函数?