首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段故障11 -网络程序

分段故障11 -网络程序
EN

Stack Overflow用户
提问于 2013-01-01 06:06:20
回答 1查看 660关注 0票数 0

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

我是C公司的新手。

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2013-01-01 07:15:03

分段错误发生在第一次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,因为这是在sendrecv之间建立的通道。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14108238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档