簡體   English   中英

綁定失敗::協議族不支持地址族-C

[英]Bind failed: : Address family not supported by protocol family - C

我在主函數中聲明了一個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_pton(AF_INET, 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;

}

使用此調用將結構傳遞到函數中

sockfd = openSocket(vector->ip_addr, vector->port, &server);

但是我得到以下錯誤。

 Bind failed: : Address family not supported by protocol family
  len = sizeof(server);

這確定了指針的大小。 您需要它指向的結構的大小,因此應為:

  len = sizeof(*server);
int openSocket(char* ip_addr, int port, struct sockaddr_in* server){
[...]
if((bind(sockfd, (struct sockaddr*)&server, len)) < 0){

server已經被聲明為指針,所以我認為在bind()調用中不需要&運算符。

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

這很有趣-您使用sockaddr_in ,它需要設置以下屬性:

  • sun_family必須等於AF_INET
  • sin_addr這是另一個結構,它具有一個unsigned long名稱s_addr ,您可能需要將其設置為INADDR_ANY +
  • sin_port這需要一個服務器端口,需要使用htons()轉換。 (確保此端口未使用++ !我要使用的端口是3333以進行測試...)

似乎您正在使用inet_pton()但是我不確定它對於設置sin_port影響是否相同。 其他看起來還不錯。

另一個區域可能存在以下問題:

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

末尾的0指定[1]:

“將協議指定為0將導致socket()使用適合於請求的套接字類型的未指定默認協議。”

我可以想象這樣一種可能性,即未指定的默認設置對於您的操作系統而言不正確,或者沒有默認設置。 我會嘗試SOCK_STREAM來測試這是否有效。

+注意:從技術上講,這將需要htonl()但是我的理解是這對這種特殊情況沒有任何作用。

++注意:如果要編寫客戶端和服務器應用程序,請記住要小心哪個擁有該端口。

[1] http://pubs.opengroup.org/onlinepubs/009695399/functions/socket.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM