0

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

1 回答 1

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_fdsendrecv

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

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

于 2013-01-01T07:15:03.063 回答