分段故障11 - 网络程序

时间:2013-01-01 06:06:20

标签: 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 <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;
}

1 个答案:

答案 0 :(得分:4)

段错误发生在第一个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.

这虽然删除了段错误,但程序很乱并且不正确。

另请注意:

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

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

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