recvfrom:错误地址,sendto:协议不支持的地址族

我正在尝试在C中实现一个小的UDP服务器/客户端应用程序,并在服务器端出现两个错误: recvfrom:错误的地址 && sendto:协议不支持的地址系列 。 我搜索了这个错误并搜索了答案,但不幸的是,他们并没有真正帮助…也许我正在以错误的方式投射参数并且没有得到它。 我希望你能给我一个提示:)。

#include  #include  #include  #include  #include  #include  #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。)

从主页引用Fedora 18 Beta recv/recvmsg/recv

 ssize_t recv(int sockfd, void *buf, size_t len, int flgags); ssize_t recvfrom(int sockfd, void*buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t* addrlen); 

recvfrom应调整自:

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

至:

  recvfrom (socket_fd, buffer, sizeof(buffer), 0, (struct sockaddr*)&dest_addr, &addrlen); 
  • 你没有初始化dest_addr
  • 数组(eg _buffer_)始终是指针类型
  • 生产程序中缓冲区必须大于FAR(动态大小),否则缓冲区的固定大小将成为堆栈粉碎的目标(安全漏洞)。