recvfrom的:错误地址,SENDTO:地址协议不支持 [英] recvfrom: Bad address, sendto: Address family not supported by protocol

查看:554
本文介绍了recvfrom的:错误地址,SENDTO:地址协议不支持的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图实现在C小UDP的服务器/客户端应用程序,并获得对服务器端两个错误: recvfrom的:错误地址&放大器;&安培; SENDTO:地址家族不受协议的支持。我搜索了这个错误,并用Google搜索答案,但遗憾的是,他们并没有真正有益......也许我是铸造参数,以错误的方式,并没有得到它。我希望你能给我一个提示:。)

 的#include<&unistd.h中GT;
#包括LT&;&文件ctype.h GT;
#包括LT&; SYS / socket.h中>
#包括LT&; SYS / types.h中>
#包括LT&; ARPA / inet.h>
#包括LT&;&errno.h中GT;#定义BUFFSIZE 256
#定义IP127.0.0.1
#定义端口7755诠释主要(无效){  INT socket_fd =插座(AF_INET,SOCK_DGRAM,0);
  炭缓冲[1] =S;  结构SOCKADDR_IN SRC_ADDR;
  结构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);  如果(socket_fd == - 1)
    PERROR(插座);  如果(绑定(socket_fd,(结构sockaddr *)及SRC_ADDR,sizeof的(SRC_ADDR))== - 1)
    PERROR(绑定);  如果(recvfrom的(socket_fd,缓冲,2,0,(结构sockaddr *)及dest_addr,(无符号整数*)的sizeof(结构SOCKADDR_IN))== - 1)
    PERROR(recvfrom的);  如果(SENDTO(socket_fd,缓冲液,2,0,(结构sockaddr *)及dest_addr,sizeof的(dest_addr))== - 1)
    PERROR(SENDTO);  如果(接近(socket_fd)== - 1)
    PERROR(亲密);  返回0;}


解决方案

您需要通过有效的指针给recvfrom。 (无符号整数*)的sizeof(结构SOCKADDR_IN)不是一个有效的指针。

修改

 如果(recvfrom的(socket_fd,缓冲,2,0,(结构sockaddr *)及dest_addr,
             (无符号整数*)的sizeof(结构SOCKADDR_IN)== -1)

要如

  socklen_t的LEN = sizeof的dest_addr;
 如果(recvfrom的(socket_fd,缓冲液,2,0,
             (结构sockaddr *)及dest_addr,和放大器; LEN)== -1)

您还构建您发送一个无效的数组,你阵列具有1的长度,但你告诉的sendto / recvfrom的,它有2的长度,以便更改

 字符缓冲区[1] =S;

 字符缓冲区[] =S;

(字符串s是字符's'和一个0字节,所以缓冲将具有长度2在后一种情况下)。

i'm trying to implement a little UDP-Server/Client Application in C and got two errors on Server-side: recvfrom: Bad address && sendto: Address family not supported by protocol. I searched for the mistake and googled for answers but, unfortunately, they wasn't really helpfully... maybe i'm casting a parameter in a wrong way and don't get it. I hope you can give me a hint :).

#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;

}

解决方案

You need to pass a valid pointer to recvfrom. (unsigned int *)sizeof(struct sockaddr_in) is not a valid pointer.

Change

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

to e.g.

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

You are also constructing an invalid array that you send, Your array has a length of 1, but you tell sendto/recvfrom that it has a length of 2. So change

char buffer[1] = "s";

to

char buffer[] = "s";

(The string "s" is the character 's' and a 0 byte, so buffer will have length 2 in the latter case.)

这篇关于recvfrom的:错误地址,SENDTO:地址协议不支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆