请教一个 A 类网络设置的问题

2019-07-17 21:03:25 +08:00
 opiviqo

1 如图所示:三个设备 IP、掩码、网关如下中间使用普通交换机(没有路由功能);

2 软件编写流程大致如流程图所示;

3 问题:单个设备接收没有问题,但是按照流程图两个设备接收数据时,每次只能接收到一次数据(就是两个设备或者一个设备第一次的返回的数据),就再也接收不到了。

请教这是我网络设置的问题;还是我程序编写的问题?是不是路由表弄得不对?

1563 次点击
所在节点    问与答
16 条回复
2067
2019-07-17 22:32:05 +08:00
跟路由表没关系,你需要用不同的 socket
also24
2019-07-17 22:51:24 +08:00
想确定是不是网络的问题,自己 ping 一下不就知道了,省的怀疑是不是自己程序的问题。

另:你这个是使用了 A 类网络的地址范围的 B 类网络,不是 A 类网络
opiviqo
2019-07-17 22:53:24 +08:00
@yujiaxin 我使用不同的 socket 流程图简化了 不好意思
opiviqo
2019-07-17 22:56:37 +08:00
@also24 是的您说的很对,这个网络配置是别人写的,我感觉他是划分子网,看他网关和子网还是能配的上(个人认为不知道准不准去)。ping 不能同时 ping 通,只能分开通,从设备 1 几下,从设备 2 几下,很奇怪
opiviqo
2019-07-17 23:08:07 +08:00
@yujiaxin 程序很简单
if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}

/* 服务器端填充 sockaddr 结构 */
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
//server_addr.sin_family=PF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

---------------------
作者:熊猫加油
来源:CSDN
原文: https://blog.csdn.net/xiongmaojiayou/article/details/7584211
版权声明:本文为博主原创文章,转载请附上博文链接!
ThirdFlame
2019-07-17 23:12:22 +08:00
1 楼已经回答的很清楚了。
gefranks
2019-07-17 23:18:02 +08:00
有路由表,没有路由功能?
我记得以前 cisco 路由器没配 ip classless 的时候这种网络重叠问题是可能存在的.
opiviqo
2019-07-17 23:18:51 +08:00
@yujiaxin 前面不小心按到回车了 代码大概就这样 很简单;
如果只运行一半 fd0 或者 fd1,程序没问题,像下面同时运行,就有问题


int fd0=socket(AF_INET,SOCK_DGRAM,0);

struct sockaddr_in addr0;
addr0.sin_family =AF_INET;
addr0.sin_port =htons(1234);
addr0.sin_addr.s_addr=inet_addr("10.0.3.230");

int fd1=socket(AF_INET,SOCK_DGRAM,0);

struct sockaddr_in addr1;
addr1.sin_family =AF_INET;
addr1.sin_port =htons(2234);
addr1.sin_addr.s_addr=inet_addr("10.0.6.230");

while ( 1 ){
sendto(fd0,...);
recvfrom(fd0);
sendto(fd1,...);
recvfrom(fd1);
sleep(1);
}
2067
2019-07-17 23:20:03 +08:00
@opiviqo

你这个代码没体现出来接收和发送报文的地方

参考下面的链接里面的源码
https://www.cs.cmu.edu/afs/cs/academic/class/15213-f99/www/class26/udpserver.c

重点信息如下

n = recvfrom(sockfd, buf, BUFSIZE, 0,
(struct sockaddr *) &clientaddr, &clientlen);

注意这个函数的定义 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
clientaddr 是要被函数修改的,执行完之后,这个信息要保存下来作为上下文使用,
sockfd+clientaddr 才是一个完整的 socket

n = sendto(sockfd, buf, strlen(buf), 0,
(struct sockaddr *) &clientaddr, clientlen);

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
到发送的时候,仍然要指定这个地址,不过这一次就是输入参数了
opiviqo
2019-07-17 23:20:37 +08:00
@gefranks 那个中间的交换机 没有路由功能,路由表是说的 主设备的路由表,我表述不清,不好意思啊!
also24
2019-07-17 23:27:34 +08:00
@opiviqo #4
你这个大家都在同一个网络里 ( 10.0.0.0/16 ),配不配网关没所谓(更何况你的网关还不存在)
opiviqo
2019-07-17 23:37:17 +08:00
@also24 是的 确实是一个网段,烦就烦在 我用主同时 ping 两个从,结果是 一下从 1 设备通,一下从 2 设备通,但是就是两个设备不同时通。。。无语
2067
2019-07-18 00:06:41 +08:00
@opiviqo arp -a 查看一下 mac 地址,如果交换机能查询的话,可以到交换机再看看 mac 地址在哪个口上
also24
2019-07-18 00:09:39 +08:00
@opiviqo #12 同楼上所说,你这种情况怎么感觉有点儿像两个从设备的 mac 地址重复了
cdlnls
2019-07-18 00:15:28 +08:00
按照你这样连,应该和路由没关系,都不用经过路由器,三个设备在同一个子网下。
这个看上去像是局域网下有 IP 冲突了,可以用 arp 查一下 mac 地址是不是对得上
Gill123
2019-07-18 00:21:35 +08:00
同一个网段网关不用,都是根据 mac 地址表的二层转发,你这个看样子像是地址冲突,再检查一下 ip 的配置

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/583921

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX