Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Haskell:不支持的操作(协议系列不支持地址系列)_C_Macos_Sockets_Haskell - Fatal编程技术网

C Haskell:不支持的操作(协议系列不支持地址系列)

C Haskell:不支持的操作(协议系列不支持地址系列),c,macos,sockets,haskell,C,Macos,Sockets,Haskell,我有一段代码连接到本地graphite(它实际上只是在本地主机上运行的nc-l-p2023): 这对我来说似乎很奇怪,所以我决定运行这个C程序(谷歌搜索“getaddrinfo”示例,更改主机名和端口,添加打印ai_系列): 因此,艾尤家族30岁似乎是件奇怪的事情。据我所知,这是AF_-TIPC协议,这是我以前很少听说的事情。我还打开了haskell's,惊讶地发现它没有处理30的值(不知道AF_TIPC) 我的问题是:现在最好做什么?我没弄错问题吧?haskell应该更好地处理未知ai家族吗?

我有一段代码连接到本地graphite(它实际上只是在本地主机上运行的
nc-l-p2023
):

这对我来说似乎很奇怪,所以我决定运行这个C程序(谷歌搜索“getaddrinfo”示例,更改主机名和端口,添加打印ai_系列):

因此,艾尤家族30岁似乎是件奇怪的事情。据我所知,这是AF_-TIPC协议,这是我以前很少听说的事情。我还打开了haskell's,惊讶地发现它没有处理30的值(不知道AF_TIPC)

我的问题是:现在最好做什么?我没弄错问题吧?haskell应该更好地处理未知ai家族吗?//谢谢

更新:我通过提示使用ipv4解决了一个问题:

addrInfos <- getAddrInfo (Just (defaultHints { addrFamily=AF_INET }))
               (Just host)
               (Just (show port))

addrInfos默认情况下,
getaddrinfo
(及其Haskell绑定
getaddrinfo
)返回addrinfo的链接列表,其中可以包含IPv4地址、IPv6地址或两者的混合。遗憾的是,套接字函数不允许将IPv4套接字连接到IPv6地址,因此在遍历地址列表时,需要创建正确类型的套接字:

addrinfos <- getAddrInfo Nothing (Just hostname) (Just (show port))
let first = head addrinfos
sock <- socket (addrFamily first) Stream defaultProtocol
connect sock (addrAddress first)

addrinfos使用
AF.*
名称而不是数字的原因是,并非每个系统上的数字都相同。Linux
socket.h
没有告诉您30在非Linux操作系统上的含义。最好在您自己的机器上检查
socket.h
。(我预测30个将是
AF_INET6
)@WumpusQ.Wumbley您是对的,谢谢!AF_INET6在我的机器上的socket.h中是30。@WumpusQ.Wumbley所以,在我试图连接的地址中:
AddrInfo{addrFlags=[],addrffamily=AF_INET6,addrSocketType=Datagram,addrProtocol=17,addradress=[::1]:2023,addrcanname=Nothing}
我看到它正确地解析了addrffamily到AF_INET6,但是我想知道AddrProtocol17是什么意思。我找到的唯一有价值的东西是
#定义AF\u路由17/*内部路由协议*/
@WumpusQ.Wumbley这里是socket.h我只知道这个问题的C端。。。但我怀疑17指的是
IPPROTO\u UDP
。如果您想使用
getaddrinfo
结果的该字段,它将在第三个参数中转到
socket()
。通常您可以将0放在那里,因为地址族和套接字类型(
SOCK_DGRAM
SOCK_STREAM
等)足以唯一地确定协议。谢谢@jch。但有一件事我不明白:>不幸的是,sockets函数不允许将IPv4套接字连接到IPv6地址localhost(它的地址
[::1]
几乎是INET6地址,所以我仍然不明白为什么会出错。您是如何创建套接字的?谢谢!您是正确的。它在库中被硬编码为IPv4
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>

#ifndef   NI_MAXHOST
#define   NI_MAXHOST 1025
#endif

int main(void)
{
    struct addrinfo *result;
    struct addrinfo *res;
    int error;

    /* resolve the domain name into a list of addresses */
    error = getaddrinfo("localhost", "2023", NULL, &result);
    if (error != 0)
    {
        fprintf(stderr, "error in getaddrinfo: %s\n", gai_strerror(error));
        return EXIT_FAILURE;
    }

    /* loop over all returned results and do inverse lookup */
    for (res = result; res != NULL; res = res->ai_next)
    {
        char hostname[NI_MAXHOST] = "";

        error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, NI_MAXHOST, NULL, 0, 0);
        if (error != 0)
        {
            fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(error));
            continue;
        }
        if (*hostname != '\0')
            printf("hostname: %s. ai_family: %i\n", hostname, res->ai_family);
    }

    freeaddrinfo(result);
    return EXIT_SUCCESS;
}
➜  getaddrinfotest  ./main
hostname: localhost. ai_family: 30
hostname: localhost. ai_family: 30
hostname: localhost. ai_family: 2
hostname: localhost. ai_family: 2
hostname: localhost. ai_family: 30
hostname: localhost. ai_family: 30
addrInfos <- getAddrInfo (Just (defaultHints { addrFamily=AF_INET }))
               (Just host)
               (Just (show port))
addrinfos <- getAddrInfo Nothing (Just hostname) (Just (show port))
let first = head addrinfos
sock <- socket (addrFamily first) Stream defaultProtocol
connect sock (addrAddress first)