can';地址[47]上的t绑定:协议族不支持地址族

can';地址[47]上的t绑定:协议族不支持地址族,c,sockets,C,Sockets,我正在使用一个用C编写的服务器软件。我创建了一个函数,用于设置一个名为config的全局变量,因此我可以在多个项目中使用此代码。 您可以从标题中获取错误消息 typedef struct ntp_conn { int domain; // addressfamily int sType; // sockettype int protocol; // protocol int socket; // socketpointer struct

我正在使用一个用C编写的服务器软件。我创建了一个函数,用于设置一个名为
config
的全局变量,因此我可以在多个项目中使用此代码。 您可以从标题中获取错误消息

typedef struct ntp_conn {
   int domain;     // addressfamily
   int sType;      // sockettype
   int protocol;   // protocol
   int socket;    // socketpointer
   struct sockaddr_in *addr; // address 
} ntp_conn;

这一点应该是我的错,但我不明白。 谢谢你的帮助


对不起,代码丢失了

您似乎从未为
config->addr
分配过任何内存。我想这至少是一个问题

是否更容易拥有:

typedef struct ntp_conn {
   int domain;              // addressfamily
   int sType;               // sockettype
   int protocol;            // protocol
   int socket;              // socketpointer
   struct sockaddr_in addr; // address <- NOTE NO '*' HERE 
} ntp_conn;
typedef结构ntp\U连接{
int域;//addressfamily
int sType;//sockettype
int协议;//协议
int-socket;//socketpointer

struct sockaddr\u in addr;//address请将您的问题代码简化为一个简单的示例。这里有很多东西对您的问题没有用处,并且缺少一些部分。因此我们确实无法理解您的问题所在。我会通过添加errno check来检查sw\u config()。根据,inet\u pton()“如果src不包含表示指定地址族中有效网络地址的字符串,则返回0。如果af不包含有效地址族,则返回-1,并将errno设置为EAFNOSUPPORT。”。"是的。我没有发布这段代码,因为我认为问题出在另一行。我试图阻止无用的垃圾邮件;)。不管怎样,当我尝试用你的结构构建代码时,xCode不喜欢。而带有发送和接收函数的简单http请求也可以用这个
swf\u config
。我建议你将问题简化为一个简单的人显示所有代码的可老化程序。通常,您会发现此过程会使程序突然工作,然后您需要通过简化它来解决您修复的问题。如果没有,请将程序发布到此处。请注意,
中的
sockaddr\u仅适用于
AF\u INET
,但许多套接字函数都采用
sockaddr*
sin\u族成员所在的指针表示实际使用的
sockaddr\u…
struct的类型
(例如,
AF\u INET6`使用
sockaddr\u in6
)。因此
ntp\u conn
使用
sockaddr\u存储
,而不是直接使用
sockaddr\u in
,更有意义。
#define BUFFERSIZE  9084
#define MAXCONN 10

#include "swf_conn.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>


ntp_conn *config;

void swf_error( char* msg ) {
    printf("\n** %s [%d]: %s", msg, errno, strerror(errno));
}

int swf_connect( ) {

    config->socket = socket( config->domain, config->sType, config->protocol);
    if( config->socket < 0 ) {
        swf_error("SOCKET-ERROR:");
        exit(-1);
    }

    if( connect((int)config->socket, (const struct sockaddr*)config->addr, sizeof(struct sockaddr_in)) < 0 ) {
        swf_error("CONNECT-ERROR");
        exit(-1);
    }

    return 0;
}

void swf_close( ) {
    close( config->socket );
    memset(&config, 0, sizeof(config));
}


int swf_config( int domain, int sType, int protocoll, char *ip, short int port ) {

    // Good idea?
    unsigned int addr;
    if( strcmp(ip, "INADDR_ANY") == 0 )
        addr = htonl(INADDR_ANY);
    else
        addr = inet_addr(ip);

    config = (struct ntp_conn*) malloc(sizeof(struct ntp_conn));
    config->addr = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));


    config->domain = domain;
    config->sType = sType;
    config->protocol = protocoll;

    config->addr->sin_family = AF_INET;
    config->addr->sin_port = htons(port);
    config->addr->sin_len = sizeof(struct sockaddr_in);
    config->addr->sin_addr.s_addr = htonl(INADDR_ANY);

    memcpy( (char *)&config->addr->sin_addr, &addr, sizeof(addr));
    return 0;
}


int swf_put( const void *data ) {

    int recived = 0;
    int sended = 0;

    ntp_thread_recv *recvObj = malloc(sizeof(ntp_thread_recv));
    ntp_thread_recv *sendObj = malloc(sizeof(ntp_thread_recv));

    if( data == NULL ) {
        swf_error("send-error: parameter == NULL");
        exit(-1);
    }

    memcpy( &sendObj->data, &data, sizeof(data) );

    printf("\n** sending");
    sended = swf_send( sendObj );

    if( sended > 0 )
        printf("\n** sended %d bytes!\n**\n%s\n", (int)sended, (char*)sendObj->data);

    recived = swf_recv( recvObj );
    printf("\n** data recived! [%d]\n%s\n", (int)sizeof(recvObj), (char*) recvObj);

    return 0;
}

int swf_send( ntp_thread_recv *sendData ) {

    ssize_t sended = 0;
    int sendSize = sizeof(sendData->data);
    int i=0;

    do {
        sended = send( config->socket, &sendData->data[i], sendSize-sended, 0);
        if( sended < 0) {
            swf_error("send-error");
            exit(-1);
        }
    } while( sended < sendSize );

    return (int)sended;
}

int swf_recv( ntp_thread_recv *recvObj ) {

    ssize_t recived = 0;
    int recvLen = sizeof(char);
    char buffer = (char) malloc(recvLen);
    memset(&recvObj->data, 0, sizeof(recvLen*BUFFERSIZE));
    int i = 0;

    do {
        recived = recv( config->socket, &buffer, recvLen, 0);

        if( recived < 0) {
            swf_error("recv-error");
            exit(-1);
        }
        recvObj->data[(i++)] = buffer;
        printf("%s\n", recvObj->data);
        memset(&buffer, 0, sizeof(buffer));
    } while ( recived > 0 && i < 20 );

    printf("%s", recvObj->data);
    return 0;

}

int swf_server( char *handleFile ) {
    int client[MAXCONN];
    struct sockaddr_in *clientAddr;
    unsigned int len;
    int i = 0;

    for( i=0; i<MAXCONN; i++)
        client[i] = 0;
    i=0;

    if( handleFile == NULL ) {
        swf_error("handleFile empty!");
        exit(-1);
    }

    config->socket = socket( config->domain, config->sType, config->protocol);
    if( config->socket < 0 ) {
        swf_error("SOCKET-ERROR:");
        exit(-1);
    }

    if( bind( config->socket, (const struct sockaddr*)&config->addr, sizeof(config->addr) ) < 0 ) {
        swf_error("can't bind on address");
        exit(-1);
    }

    if( listen( config->socket, MAXCONN ) < 0 ) {
        swf_error("can't listen on socket");
        exit(-1);
    }

    printf("\n** server waiting for connections...");

    for(;;) {

        if( ( client[i] = accept( config->socket, (struct sockaddr*)&clientAddr, &len ) ) > 0 ) {

            ntp_thread_recv *sendObj = malloc(sizeof(ntp_thread_recv));
            ntp_thread_recv *recvObj = malloc(sizeof(ntp_thread_recv));

            sendObj->data = "welcome to my server!\n\r";

            if( swf_send(sendObj) < 0 ) {
                swf_error("sending error");
                continue;
            }

            memset(&sendObj, 0, sizeof(sendObj));

            FILE *fp;
            char *recvBuff[BUFFERSIZE];
            char buff;
            int j = 0;

            while( client[i] > 0 ) {


                if( swf_recv(recvObj) < 0 ) {
                    swf_error("reciving error");
                    continue;
                }

                if( strcmp( recvObj->data, "quit") == 0 ) {
                    client[i] = 0;
                    memset(&clientAddr, 0, sizeof(clientAddr));
                    printf("\n** client closed.");
                    continue;
                }

                strcat( recvBuff, handleFile );
                strcat( recvBuff, recvObj->data );


                if( ( fp = popen( recvBuff, "r" ) ) < 0 ) {
                    swf_error("can't execute the handle file!");
                    continue;
                }

                memset( &recvBuff, 0, sizeof(recvBuff) );
                while( ( buff = fgetc(fp) ) )
                    memcpy(&recvBuff[i++], &buff, sizeof(buff));

                if( j > 0 ) {
                    memcpy(&sendObj->data, &recvBuff, (j+1)*sizeof(char));
                } else {
                    sendObj->data = "nothingtosend\n\r";
                    swf_error("can't read result from your handle file!");
                }
                j = 0;

                memset(&recvBuff, 0, sizeof(recvBuff));

                if( swf_send(sendObj) < 0 ) {
                    swf_error("sending error");
                    continue;
                }

                memset(&sendObj, 0, sizeof(sendObj));

            }

        } else {
            client[i] = 0;
        }


    }
    return 0;
}
#include <stdio.h>
#include <stdio.h>
#include "swf_conn.h"
#include <sys/socket.h>
#include <netinet/in.h>



int main(int argc, const char * argv[])
{
    char *ip = "0.0.0.0";
    //   char *buff = ( char * ) malloc( 1024 * sizeof( char ) );

    printf("\n      SERVER\n");

    printf("\n%s", ip);

    if( swf_config( PF_INET, SOCK_STREAM, IPPROTO_TCP, ip, 81) < 0 )
        printf("\n** ERROR: ");
    else
        printf("\n** socket created...");

    if( swf_server("./handleFile") < 0 )
        printf("\n** error!");


    return 0;
}
      SERVER

0.0.0.0
** socket created...
** can't bind on address [47]: Address family not supported by protocol family
typedef struct ntp_conn {
   int domain;              // addressfamily
   int sType;               // sockettype
   int protocol;            // protocol
   int socket;              // socketpointer
   struct sockaddr_in addr; // address <- NOTE NO '*' HERE 
} ntp_conn;