opiviqo
V2EX  ›  问与答

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

  •  
  •   opiviqo · Jul 17, 2019 · 2267 views
    This topic created in 2570 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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