01-关于QNX network网络那些事情

1. socket/网络测试程序

socket_service.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>


int main ( int argc , char ** argv )
{
    int rc = 0;
    int fd;
    struct sockaddr_un addr;
    socklen_t len;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    snprintf(addr.sun_path, sizeof(addr.sun_path), "/tmp/test_socket-0");

    unlink(addr.sun_path);

    fd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (fd < 0)
    {
            printf("socket create failed\n");
            rc = -4;
            goto EXIT_FLAG;
    }


    rc = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    if (rc < 0)
    {
            printf("bind failed\n");
            rc = -5;
            goto EXIT_FLAG;
    }

    listen(fd, 10);

EXIT_FLAG:
    return rc;
}

1.1 bind 问题以及衍生的疑问。

编译socket 可执行程序,经常遇到bind失败,提示permission。

# ./socket_service
bind failed

怎么搞都不行。

涉及网络,还是得io-pkt处理下

#io-pkt-v6-hc -i1 -ptcpip prefix=/alt

运行: 

#SOCK=/alt socket_service

然后就成了。。。。。。

但是SOCK=/alt ifconfig 是本地127.0.0.1 啊,如果其他网卡传输呢? 囧

# SOCK=/alt ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33136
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1

本机明明有几个网卡,为什么SOCK=/alt 下只有lo0?

# ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33136
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
pflog0: flags=0 mtu 33136
emac0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        capabilities=27<IP4CSUM,TCP4CSUM,UDP4CSUM,TSO4>
        enabled=0
        address: 02:04:00:00:01:02
        media: Ethernet none
        inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
        inet alias 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
        inet6 fe80::4:ff:fe00:102%emac0 prefixlen 64 scopeid 0x21
vp0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        capabilities rx=1f<IP4CSUM,TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM>
        capabilities tx=7e<TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM,TSO4,TSO6>
        enabled rx=1f<IP4CSUM,TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM>
        enabled tx=0
        address: aa:aa:aa:aa:aa:aa
        media: Ethernet autoselect
        status: active
        inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
        inet6 fe80::a8aa:aaff:feaa:aaaa%vp0 prefixlen 64 scopeid 0x22
bridge0: flags=41<UP,RUNNING> mtu 1500
 

网卡信息: 

# nicinfo
pflog0:

emac0:
  EMAC Ethernet Device Ethernet Controller

  Link is DOWN

  Physical Node ID ........................... 020400 000102
  Current Physical Node ID ................... 020400 000102
  Current Operation Rate ..................... Unknown
  Active Interface Type ...................... MII
    Active PHY address ....................... 7
  Maximum Transmittable data Unit ............ 1514
  Maximum Receivable data Unit ............... 1514
  Promiscuous Mode ........................... On
  Multicast Support .......................... Enabled

  Packets Transmitted OK ..................... 0
  Bytes Transmitted OK ....................... 0
  Broadcast Packets Transmitted OK ........... 0
  Multicast Packets Transmitted OK ........... 0
  Memory Allocation Failures on Transmit ..... 0

  Packets Received OK ........................ 0
  Bytes Received OK .......................... 0
  Broadcast Packets Received OK .............. 0
  Multicast Packets Received OK .............. 0
  Memory Allocation Failures on Receive ...... 0

  Single Collisions on Transmit .............. 0
  Deferred Transmits ......................... 0
  Late Collision on Transmit errors .......... 0
  Transmits aborted (excessive collisions) ... 0
  No Carrier on Transmit ..................... 0
  Receive Alignment errors ................... 0
  Packets Dropped on receive ................. 0
  Ethernet Header length field mismatches .... 0
  Ethernet Headers out of range .............. 0
  Oversized Packets received ................. 0

vp0:
   Ethernet Controller

  Physical Node ID ........................... 000000 000000
  Current Physical Node ID ................... AAAAAA AAAAAA
  Current Operation Rate ..................... 0 kb/s half-duplex
  Active Interface Type ...................... Unknown
  Maximum Transmittable data Unit ............ 1500
  Maximum Receivable data Unit ............... 1500
  Promiscuous Mode ........................... Off
  Multicast Support .......................... Enabled

  Packets Transmitted OK ..................... 569738
  Bytes Transmitted OK ....................... 38252684
  Broadcast Packets Transmitted OK ........... 3814
  Multicast Packets Transmitted OK ........... 6
  Memory Allocation Failures on Transmit ..... 0

  Packets Received OK ........................ 757679
  Bytes Received OK .......................... 1098494853
  Broadcast Packets Received OK .............. 904
  Multicast Packets Received OK .............. 80
  Memory Allocation Failures on Receive ...... 0


bridge0:
 

> > > ※解答※: 解答此问题还得从qnx网络架构说起。

结合QNX特性,如果要使用内核的网络,需要调用NetworkManager以及TCP/IP Manager 接口。

而我们第三方测试程序,使用网络资源的话需要io-pkt特殊处理。

即:io-pkt-v6-hc -ptcpip stacksize=8192,prefix=/alt

或者io-pkt-v6-hc -i1 -ptcpip prefix=/alt

然后通过[ SOCK=/alt + 指令 ] 来操作网络

通过上述指令后,SOCK=/alt 仅仅只有本地127.0.0.1 网段。如何添加其他网卡?

# SOCK=/alt ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33136
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1

这个时候需要SOCK=/alt mount -T io-pkt 操作实现

如添加vp0接口:

SOCK=/alt mount -T io-pkt -o peer=/dev/qvm/la/la_to_host,bind=/dev/vdevpeer/vp0,mac=aaaaaaaaaaaa,mode=0660 /lib/dll/devnp-vdevpeer-net.so

# SOCK=/alt ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33136
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
vp0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
        capabilities rx=1f<IP4CSUM,TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM>
        capabilities tx=7e<TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM,TSO4,TSO6>
        enabled rx=1f<IP4CSUM,TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM>
        enabled tx=0
        address: aa:aa:aa:aa:aa:aa
        media: Ethernet autoselect
        status: active

设置vp0 ip 

 # SOCK=/alt ifconfig vp0 192.168.1.1

# SOCK=/alt ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33136
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
vp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        capabilities rx=1f<IP4CSUM,TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM>
        capabilities tx=7e<TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM,TSO4,TSO6>
        enabled rx=1f<IP4CSUM,TCP4CSUM,UDP4CSUM,TCP6CSUM,UDP6CSUM>
        enabled tx=0
        address: aa:aa:aa:aa:aa:aa
        media: Ethernet autoselect
        status: active
        inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
        inet6 fe80::a8aa:aaff:feaa:aaaa%vp0 prefixlen 64 scopeid 0x11

 综上,不要问我怎么知道的,我也是孤独摸索了好几天。。。。。。。囧。 既然摸索成功了,就分享出来,免得同行同学在这里折腾浪费时间精力。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: QNX是一个实时操作系统,其网络功能的实现源码由QNX公司提供。QNX Network源码是用于实现QNX操作系统中的网络协议和功能的代码。 QNX Network的源码包括了各种网络协议的实现,例如TCP/IP、UDP、ICMP等。这些协议是实现网络通信所必需的基础,通过QNX Network源码的编写和调试,可以使QNX操作系统能够进行网络通信和数据传输。 除了协议实现外,QNX Network的源码还包括了用于网络连接管理、数据包处理和路由转发等功能的代码。这些功能的实现可以使QNX操作系统具备网络通信的能力,并能够有效地处理和传输网络数据。 QNX Network源码不仅包含了核心网络功能的实现,还提供了一些可供开发人员使用的网络编程接口和工具。这些接口和工具可以帮助开发人员更方便地进行网络应用程序的开发和调试。 通过研究和分析QNX Network的源码,开发人员可以深入理解QNX操作系统的网络功能和机制,从而更好地应用和扩展这些功能。同时,也可以通过分析源码中的实现细节和算法,优化网络性能和提高系统稳定性。 总之,QNX Network源码是用于实现QNX操作系统网络功能的代码,通过研究源码可以深入了解和优化网络功能的实现,同时也方便开发人员进行网络应用程序的开发和调试。 ### 回答2: QNX Network源码是指QNX操作系统中用于网络通信的相关代码。QNX是一款实时操作系统,广泛应用于嵌入式系统和网络通信领域。QNX Network源码包含了实现网络协议栈、网络驱动程序和网络服务等功能的代码。 QNX Network源码通过实现各种协议栈,例如TCP/IP、UDP、ICMP等,来实现网络通信功能。这些协议栈是网络通信的基础,可以实现数据包的传输、路由、分片和重组等功能。通过QNX Network源码,可以深入了解网络协议的实现原理和细节,可以对协议栈进行定制和优化,以满足特定应用的需求。 除了协议栈,QNX Network源码还包含了网络驱动程序的代码。网络驱动程序负责将网络数据传输到硬件设备上,并实现数据包的接收和发送。通过QNX Network源码,可以了解网络驱动程序的工作原理和实现方式,以及如何支持不同类型的网络设备和接口。 此外,QNX Network源码还提供了各种网络服务的实现,例如Socket API、DHCP、DNS、网络时间协议(NTP)等。这些网络服务提供了更高层次的网络通信接口和功能,可以方便应用程序开发者进行网络编程,并实现各种网络应用。 总之,QNX Network源码是QNX操作系统中用于网络通信的关键代码,它包含了协议栈、驱动程序和网络服务的实现。通过分析和理解QNX Network源码,可以深入了解网络通信的原理和实现细节,并进行定制和优化,以满足特定应用的要求。 ### 回答3: QNX是一种实时操作系统,而QNX Network源码是其网络子系统的源代码。该源代码实现了QNX操作系统的网络功能,包括网络协议栈、网络设备驱动程序等。 QNX Network源码是使用C语言编写的,可用于实现和定制网络通信功能。它提供了一种开放的平台,使开发者能够根据自己的需求自定义和扩展网络功能。 QNX Network源码的主要组成部分包括: 1. 网络协议栈:实现了各种网络协议,包括TCP/IP协议、UDP协议、ICMP协议等。它提供了数据包的处理、路由选择、错误检测等功能,是实现网络通信的基础。 2. 网络设备驱动程序:实现了与硬件设备的交互,包括网络接口卡驱动程序、无线网卡驱动程序等。它负责接收和发送网络数据包,将数据从原始格式转换为适合网络协议栈处理的格式。 3. 网络应用接口:提供了一组API接口,使开发者可以使用QNX Network功能。这些接口包括套接字接口(socket API)、网络配置接口、网络状态监测接口等,方便开发者实现各种网络应用。 通过研究和修改QNX Network源码,开发者可以实现定制化的网络功能。例如,可以添加新的网络协议、优化网络性能、增加新的设备驱动程序等。这为应用开发者提供了更大的灵活性和自由度。 总之,QNX Network源码是QNX操作系统中网络子系统的源代码,通过研究和修改该源码,可以实现和定制化各种网络功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村里小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值