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

尝试实现UDP时,ansi C中sendto的参数无效,c,udp,debian-based,C,Udp,Debian Based,我知道有一些类似的问题,但我觉得每个人都有不同的问题导致了这一点。所以我要公布我的具体情况 我正在研究树莓圆周率,使用树莓,debian的衍生物。我用ANSIC编码。这是一个服务器,通过端口500向另一端的udp客户端发送一些数据 #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> int main() { int sockfd; struct sockaddr_in

我知道有一些类似的问题,但我觉得每个人都有不同的问题导致了这一点。所以我要公布我的具体情况

我正在研究树莓圆周率,使用树莓,debian的衍生物。我用ANSIC编码。这是一个服务器,通过端口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;
}
#包括
#包括
#包括
int main()
{
int-sockfd;
servaddr、cliaddr中的结构sockaddr\u;
socklen_t clilen;
字符缓冲区[256];
sockfd=插座(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
servaddr.sinu端口=htons(500);
绑定(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
sprintf(缓冲区,“您好,这是一个测试\n”);
if(sendto(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&cliaddr,sizeof(cliaddr))=-1)
{错误(“失败:”)
};
返回0;
}

但这只是给了我一个“无效参数”的错误,我不知道什么可能是错误的。如果我提供给sendto的参数类型不正确,则编译时将失败。但是类型是正确的,并且只有在运行时才会编译失败。

您没有对
cliaddr
结构进行初始化。因此,其内容是随机的。您的代码可以很好地编译,因为在中有一个
结构sockaddr\u,但编译器无法检查您是否正确地初始化了它

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

解决方案:在使用
cliaddr
变量之前对其进行初始化

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


第二次编辑,阅读我的文章:有关我推荐的资源。对于您的确切问题,分章可以提供帮助。

它和参数的类型无关<例如,code>sockfd
可以是任何整数,即使该整数不引用套接字。因此,您的代码将被编译,但在运行时会出现错误。如何初始化cliaddr结构?我一直在努力寻找一个好的示例代码,而当前的示例代码似乎完全把我引入了歧途。请参阅第二次编辑中的链接。这是一个很好的教程,你甚至有例子。