C UDP套接字连接不是';t正确分配端口

C UDP套接字连接不是';t正确分配端口,c,sockets,struct,udp,C,Sockets,Struct,Udp,我有以下模式: program in terminal A (<process 1>): Stored: <process 1>: <portnumber 51340> <process 2>: <portnumber 58432> program in terminal B (<process 2>): Stored: <process 1>: <portnumber 513

我有以下模式:

program in terminal A (<process 1>):

Stored:
    <process 1>: <portnumber 51340>
    <process 2>: <portnumber 58432>

program in terminal B (<process 2>):

Stored:
    <process 1>: <portnumber 51340>
    <process 2>: <portnumber 58432>
在执行发送之前,我要执行以下操作:

fprintf(stdout, "Using procPort %d\n", idPort);
servaddr.sin_port = htons(<portNumber 58432>);
fprintf(stdout, "Using port %d\n", &toSocketID.sin_port);
sendto(fromSocketID, &msg, sizeof(struct message), 0, (const struct sockaddr *)&toSocketID, toSocketIDLen);
在这里之前一切都好。问题是,在我进行recvfrom之前,我会:

servaddr.sin_port = htons(<portNumber 58432>);
fprintf(stdout, "Using procPort %d\n", <portNumber 58432>);
fprintf(stdout, "Using port %d\n", servaddr.sin_port);

struct message * recievedMsg = malloc(sizeof(struct message));

recieveResult = recvfrom(socketID, recievedMsg, sizeof(*recievedMsg), 0, (const struct sockaddr *)&servaddr, sizeof(servaddr));
它没有收到消息,我想这是因为端口发生了神奇的变化,16612没有出现在我的程序中。但也可能是因为配置的原因。你知道怎么了吗?我疯了

编辑:

你们中的一些人正在争论字节交换。 第二部分的其他产出:

Using procPort 50912
Using port 57542

Using procPort 33592
Using port 14467

Using procPort 42115
Using port 33700

这些代码片段使我们很难真正了解全局,但我很确定您的编译器正在告诉您问题所在

struct sockaddr_in servaddr = {0};
...
receiveResult = recvfrom(socketID,
                         receivedMsg, sizeof(*receivedMsg),
                         0,
                         (const struct sockaddr *)&servaddr, sizeof(servaddr));
正如编译器所指出的,您正在以整数形式传递最后一个参数,但它应该是指针。其思想是告诉
recvfrom
地址结构有多大,但在返回时,内核会告诉您它使用了多少地址结构

我很惊讶它没有错,因为它给出了一个小整数作为指针

此外,倒数第二个参数不应该是
const

将此更改为(此处的格式仅用于可读性):

socklen\u t addrsize=sizeof servaddr;
receiveResult=recvfrom(socketID,
receivedMsg,大小为*receivedMsg,
0,
(结构sockaddr*)&servaddr和&addrsize);
编辑:故事的寓意:始终打开编译器警告并理解它们,而不仅仅是让它们消失。抛出随机强制转换可能会使编译器沉默,但它会删除好的建议

当你使用cast时,你告诉编译器“相信我”,如果你对编译器撒谎,它会报复你

编辑2:代码中的其他内容可能不正确

我看不出toSocketID的类型是什么,但我看不到任何正确的构造:

fprintf(stdout, "Using port %d\n", &toSocketID.sin_port);

我想
ntohs(toSocketID->sin\u port)
似乎更合理。

这些代码片段很难真正了解全局,但我很确定您的编译器正在告诉您问题所在

struct sockaddr_in servaddr = {0};
...
receiveResult = recvfrom(socketID,
                         receivedMsg, sizeof(*receivedMsg),
                         0,
                         (const struct sockaddr *)&servaddr, sizeof(servaddr));
正如编译器所指出的,您正在以整数形式传递最后一个参数,但它应该是指针。其思想是告诉
recvfrom
地址结构有多大,但在返回时,内核会告诉您它使用了多少地址结构

我很惊讶它没有错,因为它给出了一个小整数作为指针

此外,倒数第二个参数不应该是
const

将此更改为(此处的格式仅用于可读性):

socklen\u t addrsize=sizeof servaddr;
receiveResult=recvfrom(socketID,
receivedMsg,大小为*receivedMsg,
0,
(结构sockaddr*)&servaddr和&addrsize);
编辑:故事的寓意:始终打开编译器警告并理解它们,而不仅仅是让它们消失。抛出随机强制转换可能会使编译器沉默,但它会删除好的建议

当你使用cast时,你告诉编译器“相信我”,如果你对编译器撒谎,它会报复你

编辑2:代码中的其他内容可能不正确

我看不出toSocketID的类型是什么,但我看不到任何正确的构造:

fprintf(stdout, "Using port %d\n", &toSocketID.sin_port);

我可以想象
ntohs(toSocketID->sinu-port)
似乎更合理。

当字节交换为58432时,您缺少
ntohs(servaddr.sinu-port)
-16612。@user58697我想您有输入错误;0xE3E6是58342,这是感兴趣的值的换位。@sanz_sual-当你说“没有收到消息”时-这是如何表现出来的?挂断?系统调用返回失败?垃圾数据?这看起来不对:
fprintf(stdout,“使用端口%d\n”,&toSocketID.sin\u端口)-
看起来有误。
fprintf(stdout,“使用端口%d\n”,&toSocketID.sinu端口)是错误的。我不理解你对@SteveFriedl评论的反应。你搞错了,就这么简单。当字节交换为58432时,你缺少了
ntohs(servaddr.sin_port)
-16612。@user58697我想你是打字错误;0xE3E6是58342,这是感兴趣的值的换位。@sanz_sual-当你说“没有收到消息”时-这是如何表现出来的?挂断?系统调用返回失败?垃圾数据?这看起来不对:
fprintf(stdout,“使用端口%d\n”,&toSocketID.sin\u端口)-
看起来有误。
fprintf(stdout,“使用端口%d\n”,&toSocketID.sinu端口)是错误的。我不理解你对@SteveFriedl评论的反应。你搞错了,就这么简单。
fprintf(stdout, "Using port %d\n", &toSocketID.sin_port);