请教一个 A 类网络设置的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
opiviqo
V2EX    问与答

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

  •  
  •   opiviqo 2019-07-17 21:03:25 +08:00 1903 次点击
    这是一个创建于 2359 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言    2019-07-17 23:40:14 +08:00
    简单来说这个问题就是
    1,如何用发送数据到一个 A 类地址的同网段的两个 IP 地址?
    2,设置成如图所示的 ip 地址,从主设备同时 ping 两个从设备,一下子从设备 0 通,一下子从设备 1 通,但是就是两个设备不同时通
    16 条回复    2019-07-18 00:21:35 +08:00
    2067
        1
    2067  
       2019-07-17 22:32:05 +08:00
    跟路由表没关系,你需要用不同的 socket
    also24
        2
    also24  
       2019-07-17 22:51:24 +08:00
    想确定是不是网络的问题,自己 ping 一下不就知道了,省的怀疑是不是自己程序的问题。

    另:你这个是使用了 A 类网络的地址范围的 B 类网络,不是 A 类网络
    opiviqo
        3
    opiviqo  
    OP
       2019-07-17 22:53:24 +08:00
    @yujiaxin 我使用不同的 socket 流程图简化了 不好意思
    opiviqo
        4
    opiviqo  
    OP
       2019-07-17 22:56:37 +08:00
    @also24 是的您说的很对,这个网络配置是别人写的,我感觉他是划分子网,看他网关和子网还是能配的上(个人认为不知道准不准去)。ping 不能同时 ping 通,只能分开通,从设备 1 几下,从设备 2 几下,很奇怪
    opiviqo
        5
    opiviqo  
    OP
       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
        6
    ThirdFlame  
       2019-07-17 23:12:22 +08:00
    1 楼已经回答的很清楚了。
    gefranks
        7
    gefranks  
       2019-07-17 23:18:02 +08:00
    有路由表,没有路由功能?
    我记得以前 cisco 路由器没配 ip classless 的时候这种网络重叠问题是可能存在的.
    opiviqo
        8
    opiviqo  
    OP
       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
        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);
    到发送的时候,仍然要指定这个地址,不过这一次就是输入参数了
    opiviqo
        10
    opiviqo  
    OP
       2019-07-17 23:20:37 +08:00
    @gefranks 那个中间的交换机 没有路由功能,路由表是说的 主设备的路由表,我表述不清,不好意思啊!
    also24
        11
    also24  
       2019-07-17 23:27:34 +08:00
    @opiviqo #4
    你这个大家都在同一个网络里 ( 10.0.0.0/16 ),配不配网关没所谓(更何况你的网关还不存在)
    opiviqo
        12
    opiviqo  
    OP
       2019-07-17 23:37:17 +08:00
    @also24 是的 确实是一个网段,烦就烦在 我用主同时 ping 两个从,结果是 一下从 1 设备通,一下从 2 设备通,但是就是两个设备不同时通。。。无语
    2067
        13
    2067  
       2019-07-18 00:06:41 +08:00   1
    @opiviqo arp -a 查看一下 mac 地址,如果交换机能查询的话,可以到交换机再看看 mac 地址在哪个口上
    also24
        14
    also24  
       2019-07-18 00:09:39 +08:00
    @opiviqo #12 同楼上所说,你这种情况怎么感觉有点儿像两个从设备的 mac 地址重复了
    cctv6
        15
    cctv6  
       2019-07-18 00:15:28 +08:00 via iPhone
    按照你这样连,应该和路由没关系,都不用经过路由器,三个设备在同一个子网下。
    这个看上去像是局域网下有 IP 冲突了,可以用 arp 查一下 mac 地址是不是对得上
    Gill123
        16
    Gill123  
       2019-07-18 00:21:35 +08:00 via Android
    同一个网段网关不用,都是根据 mac 地址表的二层转发,你这个看样子像是地址冲突,再检查一下 ip 的配置
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2359 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 03:13 PVG 11:13 LAX 19:13 JFK 22:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86