尝试实现UDP时,ansi中的sendto参数无效

时间:2013-09-18 17:21:38

标签: c udp debian-based

我知道在SO上有一些类似的问题,但我觉得每个人都有一个不同的问题导致了这个问题。所以我发布了我的具体案例。

我正在研究覆盆子pi,使用raspbian,一种debian衍生物。我在ansi C编码。这是一个服务器,通过端口500向另一端的udp客户端发送一些数据。

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
int main()
{
   int sockfd;
   struct sockaddr_in servaddr,cliaddr;
   socklen_t clilen;
   char buffer[256];

   sockfd=socket(AF_INET,SOCK_DGRAM,0);

   bzero(&servaddr,sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   servaddr.sin_port=htons(500);
   bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
   sprintf(buffer,"hi this is a test \n");
   if(sendto(sockfd,buffer,sizeof(buffer),0,(struct sockaddr *)&cliaddr,sizeof(cliaddr))==-1)
   { error("fail:")
    };

   return 0;
}

但这只是给我错误的“无效论据”,我无法弄清楚可能出错的地方。如果我提供给sendto的参数类型不正确,那么在编译时会失败。但是类型是正确的并且这个编译,只有在运行时才会失败。

1 个答案:

答案 0 :(得分:2)

您没有cliaddr结构的初始化。因此,其内容是随机的。你的代码编译得很好,因为你应该有一个struct sockaddr_in,但编译器无法检查你是否正确初始化它。

另一方面,在运行时调用sendtoglibc或内核发现cliaddr结构中的随机数据看起来不像有效地址抛出invalid argument错误。

解决方案:在使用之前初始化cliaddr变量。

编辑:您还需要正确初始化套接字,第三个参数不应该是0

第二次修改,自述:对于资源,我建议使用the extraordinary guide of Beej。对于您的确切问题,this子章节可以提供帮助。