协议不支持的c ++地址族

时间:2018-04-09 19:44:46

标签: c++ sockets networking tcp

我编写了一个方法,它创建一个套接字,将它连接到端点,然后返回它的描述符:

static int open_socket(const char* host, unsigned short port)
        {
            #ifdef USE_IPV4
            struct hostent* _hostent;
            struct sockaddr_in _sockaddr_in;

            // Variables
            size_t sockaddr_len;
            int sock_family;
            int sock_type;
            int sock_protocol;
            int sockfd;

            _hostent = gethostbyname(host);
            if (_hostent == (struct hostent*) 0)
            {
                // Not Found
            }

            _sockaddr_in.sin_family = AF_INET;
            sock_family = AF_INET;
            sock_type = SOCK_STREAM;
            sock_protocol = IPPROTO_TCP;
            sockaddr_len = sizeof(_sockaddr_in);
            (void*) memmove(&_sockaddr_in, _hostent->h_addr, _hostent->h_length);
            _sockaddr_in.sin_port = htons(port);

            // Now create socket
            sockfd = socket(sock_family, sock_type, sock_protocol);
            if (sockfd < 0)
            {
                // "Internal Error"
            }
            if (connect(sockfd, (struct sockaddr*) &_sockaddr_in, sockaddr_len) < 0)
            {
                std::cerr << strerror(errno) << std::endl;
                std::cerr << "Endpoint is unavailable" << std::endl;
                return 0;
                // "Unavailable"
            }

            return sockfd;

            #endif
        }

尝试连接套接字时发生错误。 strerror(errno)返回&#34;协议不支持的地址族&#34;。我无法弄清楚为什么会发生这种情况,因为在其他样本中AF_INET与IPPROTO_TCP一起很好用

1 个答案:

答案 0 :(得分:1)

您需要将地址存储在sockaddr_in::sin_addr中。当您致电sin_family时,您正在覆盖整个结构(从memmove(&_sockaddr_in, ...)开始)。