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 函数的值是正确的。 我遇到段错误。任何帮助表示赞赏。

最佳答案

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

  1. main() ,您刚刚声明了一个指向 struct sockaddr_in 的指针,但是你没有分配它,你可以定义 struct sockaddr_in server并通过 &serveropenSocket() .

  2. 在openSocket中,“server”被声明为指针,但是你的语句len = sizeof(server); bzero(&server, len);不正确,这就是发生分段违规的地方。

  3. 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 - 管道文件描述符错误

c# - 指定的参数超出了有效值的范围。参数名称 : size & Serial Port Communication

java - Node.JS 和 Java PUB/SUB

c - 绑定(bind)到两个本地 IP 失败

c - 将结构数组传递给函数

c - 带符号的位域至少需要两位

c++ - 段错误后 GDB 不返回

c++ - 如何在 Windows 上编译 Clang

python - 使用 UDP 套接字将 C++ 结构转换为 Python

java - LocalSocket 写入和刷新以管道错误结束