c - recvfrom : Bad address, sendto: 协议(protocol)不支持的地址族

标签 c udp chat recv sendto

我试图在 C 中实现一个小的 UDP 服务器/客户端应用程序,但在服务器端出现了两个错误:recvfrom: Bad address && sendto: Address family not supported by协议(protocol)。我搜索了错误并在谷歌上搜索了答案,但不幸的是,它们并没有真正的帮助……也许我以错误的方式传递了一个参数并且没有得到它。我希望你能给我一个提示 :)。

#include <unistd.h>
#include <ctype.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>

#define BUFFSIZE 256
#define IP "127.0.0.1"
#define PORT 7755

int main(void){

  int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
  char buffer[1] = "s";

  struct sockaddr_in src_addr;
  struct sockaddr_in dest_addr;

  src_addr.sin_family = AF_INET;
  src_addr.sin_port = htons(PORT);
  src_addr.sin_addr.s_addr = inet_addr(IP);

  if(socket_fd==-1)
    perror("socket");

  if(bind(socket_fd, (struct sockaddr*)&src_addr, sizeof(src_addr))==-1)
    perror("bind");

  if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, (unsigned int *)sizeof(struct sockaddr_in))==-1)
    perror("recvfrom");

  if(sendto(socket_fd, buffer, 2, 0,(struct sockaddr*)&dest_addr, sizeof(dest_addr))==-1)
    perror("sendto");

  if(close(socket_fd)==-1)
    perror("close");

  return 0;

}

最佳答案

您需要将一个有效的指针传递给 recvfrom。 (unsigned int *)sizeof(struct sockaddr_in) 不是有效指针。

改变

 if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, 
             (unsigned int *)sizeof(struct sockaddr_in) == -1)

例如

 socklen_t len = sizeof dest_addr;
 if(recvfrom(socket_fd, buffer, 2, 0, 
             (struct sockaddr*)&dest_addr, &len) == -1)

您还构造了一个您发送的无效数组,您的数组长度为 1,但您告诉 sendto/recvfrom 它的长度为 2。所以更改

char buffer[1] = "s";

char buffer[] = "s";

(字符串“s”是字符“s”和一个 0 字节,因此在后一种情况下,buffer 的长度为 2。)

关于c - recvfrom : Bad address, sendto: 协议(protocol)不支持的地址族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13898207/

相关文章:

c - 变量声明并清除其中驻留的任何先前信息......如何?

C: 如果我一次发送少于 6 个字节,Curl 不会接收字节

c++ - 编写客户端和服务器,UDP

c - 从以太网帧中提取 UDP 数据包有效负载

c# - 如何阻止 TCP 和 UDP 数据包(洪水攻击)

c++ - 为什么使用 GCC 在 x86 上整数溢出会导致无限循环?

ios - 如何使用 MessageKit 创建自定义单元格?

client - 无服务器互联网聊天客户端?

Android:使用 Socket over Web API 聊天有什么好处?

c++ - 确定来自不同设备的输入