首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
V2EX  ›  问与答

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

  •  
  •   opiviqo · 96 天前 · 709 次点击
    这是一个创建于 96 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    另:你这个是使用了 A 类网络的地址范围的 B 类网络,不是 A 类网络
        3
    opiviqo   96 天前
    @yujiaxin 我使用不同的 socket 流程图简化了 不好意思
        4
    opiviqo   96 天前
    @also24 是的您说的很对,这个网络配置是别人写的,我感觉他是划分子网,看他网关和子网还是能配的上(个人认为不知道准不准去)。ping 不能同时 ping 通,只能分开通,从设备 1 几下,从设备 2 几下,很奇怪
        5
    opiviqo   96 天前
    @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   96 天前
    1 楼已经回答的很清楚了。
        7
    gefranks   96 天前
    有路由表,没有路由功能?
    我记得以前 cisco 路由器没配 ip classless 的时候这种网络重叠问题是可能存在的.
        8
    opiviqo   96 天前
    @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   96 天前
    @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);
    到发送的时候,仍然要指定这个地址,不过这一次就是输入参数了
        10
    opiviqo   96 天前
    @gefranks 那个中间的交换机 没有路由功能,路由表是说的 主设备的路由表,我表述不清,不好意思啊!
        11
    also24   96 天前
    @opiviqo #4
    你这个大家都在同一个网络里 ( 10.0.0.0/16 ),配不配网关没所谓(更何况你的网关还不存在)
        12
    opiviqo   96 天前
    @also24 是的 确实是一个网段,烦就烦在 我用主同时 ping 两个从,结果是 一下从 1 设备通,一下从 2 设备通,但是就是两个设备不同时通。。。无语
        13
    2067   96 天前   ♥ 1
    @opiviqo arp -a 查看一下 mac 地址,如果交换机能查询的话,可以到交换机再看看 mac 地址在哪个口上
        14
    also24   96 天前
    @opiviqo #12 同楼上所说,你这种情况怎么感觉有点儿像两个从设备的 mac 地址重复了
        15
    cdlnls   96 天前 via iPhone
    按照你这样连,应该和路由没关系,都不用经过路由器,三个设备在同一个子网下。
    这个看上去像是局域网下有 IP 冲突了,可以用 arp 查一下 mac 地址是不是对得上
        16
    Gill123   96 天前 via Android
    同一个网段网关不用,都是根据 mac 地址表的二层转发,你这个看样子像是地址冲突,再检查一下 ip 的配置
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   951 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 20:11 · PVG 04:11 · LAX 13:11 · JFK 16:11
    ♥ Do have faith in what you're doing.