【问题标题】:Address family not supported by protocol? sendto协议不支持地址族?发送至
【发布时间】:2011-10-20 23:41:24
【问题描述】:

我的程序遇到了一个奇怪的问题。

我一直在使用 UDP 传输文件,使用标准的 sendto 和 recvfrom。

我让服务器和客户端在程序期间多次来回通信。

我刚刚在服务器代码中添加了一个新的 sendto 调用,它在执行时给了我这个错误。

Address family not supported by protocol. 这来自我的 sendto 函数。

这是它正在执行的代码:

if ((numbytes = sendto(sockfd,sDropped,strlen(sDropped), 0,
         (struct sockaddr *)&their_addr, p->ai_addrlen)) == -1) {
    perror("talker: sendto");
    exit(1);
    }

正如我所说,这段代码在程序的早期工作了大约 4 次,所以我确信我已经把所有东西都连接好了。

有没有人熟悉这个问题,并且可以告诉我在我的程序中检查什么可能会产生这个问题?

谢谢。

【问题讨论】:

  • 我怀疑their_addr 不是一个有效的struct sockaddr_in 或者任何适合正在使用的地址系列的结构。也许它是一个没有 sockaddr 结构头的原始 IP 地址......?我认为你应该使用p->ai_addr
  • 尽管看起来有些东西显然没有正确设置/定义,你应该添加你的 sockfd 代码,p 指向的结构,以及它们的_addr,加上 prio 相关的 socket(),connect()(可能没有作为 UDP) 调用等。否则很难看到发生了什么。
  • 根据错误,您可能正在使用带有 UDP send() 的 tcp 套接字,或类似的东西。
  • 我不明白的是它之前没有任何问题......它经历了4个左右的调用没有问题,发送数据并且没有任何投诉。提到的任何问题都不会影响每次通话吗?
  • 那么你可能有一个内存损坏错误覆盖了地址结构;可能是相邻数组变量中的缓冲区溢出...

标签: c networking udp


【解决方案1】:

看看是否设置了 their_addr.sin_family,只是为了那个错误而浪费了几个小时来处理相同的消息。

【讨论】:

  • server.sin_family=AF_INET; 是我摆脱这个错误所需要的。
【解决方案2】:

使用强制转换意味着their_addr 中的任何旧垃圾都将编译。

(struct sockaddr *)&their_addr

their_addr 已经是指针了吗?那么&their_addr 给出了一个指向指针的指针?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2013-12-20
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多