c - 绑定(bind)套接字 : SIGSEGV

标签 c sockets

我在主函数中声明了指向以下结构的指针

struct sockaddr_in* server;

我将此结构用于返回绑定(bind)到此结构的套接字描述符的函数。
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;

}

但是,当我尝试读取传递给函数的结构中的各个字段时,我得到一个段错误。那是当我在我的 main 中运行以下代码时
sockfd = openSocket(vector->ip_addr, vector->port, server);
printf("%s %d\n", inet_ntoa(server->sin_addr), htons(server->sin_port) );

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

最佳答案

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

  • main() ,您刚刚声明了一个指向 struct sockaddr_in 的指针,但你没有赋值,你可以定义struct sockaddr_in server并通过 &serveropenSocket() .
  • 在 openSocket 中,“server”被声明为指针,但你的语句 len = sizeof(server); bzero(&server, len);不正确,这是您的分段违规发生的地方。
  • openSocket() , bind(sockfd, (struct sockaddr*)&server, len)不正确,不需要使用&server , 只需使用 server .

  • 所以你应该改变你的代码如下:
    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) );
    

    关于c - 绑定(bind)套接字 : SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33838627/

    相关文章:

    c - 预期为 ‘struct matrix_t *’ 但参数的类型为 ‘struct matrix_t *’ ?_?没有不同

    c - 结构体的全局数组,在程序中声明大小并在不通过的情况下全局使用?

    sockets - 在手机上运行服务器,使用蜂窝连接

    objective-c - 何时关闭NSOutputStream?

    java - TcpSockets 不连接

    c - SO_RCVTIMEO 会影响 accept() 吗?

    c - 使用套接字进行文件传输和修改

    python - 编写 telnet 客户端

    c - 段错误——但指针不是 NULL

    javascript - 使用 JQuery/socket.io 控制何时调用 ARI 函数