当前位置:  开发笔记 > 程序员 > 正文

套接字编程:sendto始终以errno 22(EINVAL)失败

如何解决《套接字编程:sendto始终以errno22(EINVAL)失败》经验,为你挑选了2个好方法。

我总是没有发送任何字节,使用此代码的错误为22(EINVAL,无效参数).在destination_host别处设置并且已知有效,所以我真的不知道发生了什么. MAXMSGSIZE是1000.没有错误或警告.我正在编译-Wall -Werror -pedantic

char *data_rec;
u_int data_len;

int sockfd;
uint16_t *ns;
struct sockaddr_in address;
struct sockaddr *addr;

char *ip;

int i;
int errno;
int bytes_sent;

data_len = MAXMSGSIZE;
data_rec = malloc(sizeof(char)*MAXMSGSIZE);
ns = malloc(MAXMSGSIZE*sizeof(uint16_t));
ip = malloc(MAXMSGSIZE*sizeof(char));

data_rec = "some random test stuff";

sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd<0) {
    printf("socket() failed\n");
}

inet_ntop(AF_INET,destination_host->h_addr,ip,MAXMSGSIZE);
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(theirPort);
address.sin_addr.s_addr = (unsigned long)ip;

addr = (struct sockaddr*)&address;
bind(sockfd,addr,sizeof(address));
/*Convert the message to uint16_t*/
for(i=0; i

nos.. 11

你给出了错误的地址大小.addr真是一个struct sockaddr_in,而不是一个struct sockaddr.

将sendto的最后一个参数更改为 sizeof(address)



1> nos..:

你给出了错误的地址大小.addr真是一个struct sockaddr_in,而不是一个struct sockaddr.

将sendto的最后一个参数更改为 sizeof(address)



2> SimonJ..:

inet_ntop可能不是你想要的 - 它从网络(即线)格式转换为表示格式(即"1.2.3.4").尝试:

address.sin_addr.s_addr = *((unsigned long *)destination_host->h_addr);

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有