我知道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 的参数类型不正确,这将在编译时失败。但是类型是正确的,并且可以编译,只有在运行时才会失败。
您没有初始化cliaddr
结构。因此,其内容是随机的。您的代码编译良好,因为您有一个struct sockaddr_in
它应该在的位置,但编译器无法检查您是否已正确初始化它。
另一方面,在运行时,当调用sendto
时,glibc
或内核发现cliaddr
结构中的随机数据看起来不像有效地址并引发invalid argument
错误。
解决方案:在使用cliaddr
变量之前对其进行初始化。
编辑:您还需要正确初始化套接字,第三个参数不应该0
。
第二次编辑,读我:对于资源,我推荐Beej的非凡指南。对于您的确切问题,本小章可以提供帮助。