请教这是我网络设置的问题;还是我程序编写的问题?是不是路由表弄得不对?
1
2067 2019-07-17 22:32:05 +08:00
跟路由表没关系,你需要用不同的 socket
|
2
also24 2019-07-17 22:51:24 +08:00
想确定是不是网络的问题,自己 ping 一下不就知道了,省的怀疑是不是自己程序的问题。
另:你这个是使用了 A 类网络的地址范围的 B 类网络,不是 A 类网络 |
4
opiviqo OP @also24 是的您说的很对,这个网络配置是别人写的,我感觉他是划分子网,看他网关和子网还是能配的上(个人认为不知道准不准去)。ping 不能同时 ping 通,只能分开通,从设备 1 几下,从设备 2 几下,很奇怪
|
5
opiviqo OP @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 版权声明:本文为博主原创文章,转载请附上博文链接! |
6
ThirdFlame 2019-07-17 23:12:22 +08:00
1 楼已经回答的很清楚了。
|
7
gefranks 2019-07-17 23:18:02 +08:00
有路由表,没有路由功能?
我记得以前 cisco 路由器没配 ip classless 的时候这种网络重叠问题是可能存在的. |
8
opiviqo OP @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); } |
9
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); 到发送的时候,仍然要指定这个地址,不过这一次就是输入参数了 |
11
also24 2019-07-17 23:27:34 +08:00
@opiviqo #4
你这个大家都在同一个网络里 ( 10.0.0.0/16 ),配不配网关没所谓(更何况你的网关还不存在) |
12
opiviqo OP @also24 是的 确实是一个网段,烦就烦在 我用主同时 ping 两个从,结果是 一下从 1 设备通,一下从 2 设备通,但是就是两个设备不同时通。。。无语
|
15
cdlnls 2019-07-18 00:15:28 +08:00 via iPhone
按照你这样连,应该和路由没关系,都不用经过路由器,三个设备在同一个子网下。
这个看上去像是局域网下有 IP 冲突了,可以用 arp 查一下 mac 地址是不是对得上 |
16
Gill123 2019-07-18 00:21:35 +08:00 via Android
同一个网段网关不用,都是根据 mac 地址表的二层转发,你这个看样子像是地址冲突,再检查一下 ip 的配置
|