绑定套接字:SIGSEGV

时间:2015-11-21 01:19:07

标签: c sockets

我在主函数

中声明了一个指向以下结构的指针
struct sockaddr_in* server;

我将此结构用于返回绑定到此结构的套接字描述符的函数。

int openSocket(char* ip_addr, int port, struct sockaddr_in* server){

    int sockfd, len;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if(sockfd < 0){
        perror("Failed to open socket: ");
        exit(-1);
    }

    len = sizeof(server);
    bzero(&server, len);
    server->sin_family= AF_INET;
    inet_aton(ip_addr, &server->sin_addr);
    server->sin_port= htons(port);

    if((bind(sockfd, (struct sockaddr*)&server, len)) < 0){
        perror("Bind failed: ");
        exit(-1);
    }
    return sockfd;

}

然而,当我尝试读取传递给函数的结构中的各个字段时,我得到一个seg错误。那是我在主

中运行以下代码的时候
sockfd = openSocket(vector->ip_addr, vector->port, server);
printf("%s %d\n", inet_ntoa(server->sin_addr), htons(server->sin_port) );

传递给openSocket函数的值是正确的。 我得到segmentation fault。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

在我再次查看您的代码之后,我发现有三个错误。

  1. main()中,您刚刚声明了一个指向struct sockaddr_in的指针,但您没有指定它,您可以定义struct sockaddr_in server并传递&serveropenSocket()

  2. 在openSocket中,&#34;服务器&#34;声明为指针,但您的语句len = sizeof(server); bzero(&server, len);不正确,这是您的分段违规发生的地方。

  3. openSocket()bind(sockfd, (struct sockaddr*)&server, len)不正确,您不需要使用&server,只需使用server

    < / LI>

    所以你应该改变你的代码如下:

    len = sizeof(server); ----> len = sizeof(struct sockaddr_in)
    bzero(&server, len);  ----> bzero(server, len);
    if((bind(sockfd, (struct sockaddr*)&server, len)) < 0){ ----->
    if((bind(sockfd, (struct sockaddr*)server, len)) < 0){
    
    struct sockaddr_in* server; 
    sockfd = openSocket(vector->ip_addr, vector->port, server);
    printf("%s %d\n", inet_ntoa(server->sin_addr), htons(server->sin_port) );
    ---->
    struct sockaddr_in server; 
    sockfd = openSocket(vector->ip_addr, vector->port, &server);
    printf("%s %d\n", inet_ntoa(server.sin_addr), htons(server.sin_port) );
    

答案 1 :(得分:0)

您刚刚将“server”声明为指向struct sockaddr_in的指针,但您没有指定它。你可以这样做:

struct sockaddr_in server;
sockfd = openSocket(vector->ip_addr, vector->port, &server);
printf("%s %d\n", inet_ntoa(server.sin_addr), htons(server.sin_port) );

答案 2 :(得分:-1)

bind(sockfd, (struct sockaddr*)&server, len)

问题出在这里。 server已经是一个指针。你不应该拿它的地址。

bind(sockfd, (struct sockaddr*)server, len)

而且,正如@nos指出的那样,你需要在某处初始化它。静态变量没有理由成为指针。它可以是struct sockaddr_in