尝试实现UDP时,ansi C中sendto的参数无效
我知道有一些类似的问题,但我觉得每个人都有不同的问题导致了这一点。所以我要公布我的具体情况 我正在研究树莓圆周率,使用树莓,debian的衍生物。我用ANSIC编码。这是一个服务器,通过端口500向另一端的udp客户端发送一些数据尝试实现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
#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结构?我一直在努力寻找一个好的示例代码,而当前的示例代码似乎完全把我引入了歧途。请参阅第二次编辑中的链接。这是一个很好的教程,你甚至有例子。