0

我知道关于 SO 有一些类似的问题,但我觉得每个人都有不同的问题导致这种情况。所以我发布了我的特殊情况。

我正在使用 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 的参数类型不正确,这将在编译时失败。但是类型是正确的并且可以编译,只有在运行时才会失败。

4

1 回答 1

2

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

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

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

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

第二次编辑,读我:对于资源,我推荐Beej 的非凡指南。对于您的确切问题,本小节可以提供帮助。

于 2013-09-18T17:28:52.750 回答