请教在QNX下能否实现...

我刚开始接触QNX,目的完成一个项目,项目的一部分是关于双网卡的,具体如下:
1、打算在目标系统上安装两块网卡,QNX应该支持吧?
2、网卡的通讯将要采用UDP/IP协议,同时实现组播的功能,也就是目标系统向指定的一组站点发送广播包,能实现吗?
3、发送组播时能否动态改变所指定的组内的成员吗?
4、QNX能实现最小多少的定时器?
5、最终系统是嵌入式应用,能否通过网络的方式在PC上得到该嵌入式应用的CPU占用率呢?
等等还有一些目前提不出来的问题…
请各位专家帮我看看这些功能在QNX上能否实现,特别是双网卡和组播的功能最为关键。
谢谢!

我在qnx6.2.1A上装了四块网卡(rtl的),目前还没有发现问题。至于
qnx的其他版本,本人不是很清楚不敢乱说。

qnx上的udp/ip可以采用广播的形式,但为什么不采用tcp/ip协议呢?这样虽然
慢点,但可靠得多.

10us定时在qnx6.2.1A上没有问题.不过定时器站用一定的cpu奥.

qnx6.2.1A上有专门看cpu使用的程序,至于通过网络查看cpu使用
情况没有试过.

谢谢您的指点。
我们的系统采用10M的网卡,且数据量较大,而且实现一些特殊的功能,因此采用UDP/IP协议。

不知能否实现我所说的组播的功能呢?我所说的组播有两个特点:
1、不希望网络上所有的节点都能收到,仅希望我指定的一些构成一组的机器能收到我发出的广播包。
2、能动态的添加或删除接收组播的这组成员。

另外,还有个问题: 能够动态设置网卡的IP地址呢? 据我目前了解的情况来看都是在制作image的时候在startup sricpt中在io-net的参数中设置ip地址的,如果我的软件在嵌入系统中已经运行了,之后我通过PC向嵌入系统发送一个IP地址给这个嵌入系统,希望它能把它的IP地址设置为我所期望的IP地址,能办到吗?

组播和动态组播地址都可以通过Socket API来实现。

动态IP地址分配,比较常见的是DHCP,不过,需要
在网络上有DHCP Server。

还有一种比较新的“自动IP地址”,也称“零配置”
(Zero Configuration),可以自动配置LAN中的IP
地址。这个,要到下一个版本的QNX 6.3才会与
用户见面 :slight_smile:

我想请教版主,能否简单介绍一下怎样用SocketAPI实现组播功能,谢谢!

to Zhang,
在某些应用环境中,比如实时系统,数据通信除可靠性要求外,还有严格的时间限定要求。通常认为采用TCP面向连接的协议将提高通信的可靠性,但TCP在丢包时会重发数据,直至发送成功,而不会理会是否有新的数据到来需要传输,这样就造成了发送数据所需要的时间的不确定性,而这恰恰是实时系统中不允许的。而采用UDP协议设计专门的通信模型,则可以使满足确定性要求的实时通信成为可能。

to Lonki,
不知您的问题解决没有,我们现在做的东东也需要解决和您类似的问题,:slight_smile:
希望来信交流.
info@hiqnx.com

有几个问题。

1)使用较新的 QNX6(6.2.1B是最新的),早期的版本在Multicast上有bug
2)QNX6上有 tiny tcpip (ttcpip), v4 only tcpip (tcpip-v4)和v4/v6 tcpip (tcpip-v6)三种,Multicast只在后两种里有。看看你的 /lib/dll就会明的。
3)在命令行上给出IP 地址,是 tiny tcpip 的手动设定方法。其它两个的手动设定方法是用 ifconfig,route,这些命令来实行的。
4)除了手动设定IP地址外,可以用DHCP(用dhcp.client程序)。

下面是很简单的两个例子,一个在Multicast上发,一个在Multicast上收。
Socket API, Multicast的例子,网上还有许多。NetBSD/FreeBSD/Linux都是
用这个API的。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/uio.h>

#define PORT 1025
#define MCAST_GROUP "225.0.0.40"

int
main(void)
{
    int s, ret;
    struct ip_mreq mreq;
    struct sockaddr_in sad;
	char buf[1024];


    if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
         perror("socket");
         return 1;
    }

    memset(&sad, 0, sizeof(sad));
    sad.sin_family      = AF_INET;
    sad.sin_addr.s_addr = inet_addr(MCAST_GROUP);
    sad.sin_port        = htons(PORT);
    
    if (bind(s, (struct sockaddr *)&sad, sizeof(sad)) == -1) {
        perror("bind");
        return 1;
    }
    
    mreq.imr_multiaddr.s_addr = inet_addr(MCAST_GROUP);
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);
    if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) {
        perror("setsockopt");
        return 1;
    }

    for(;;) {
        if((ret = read(s, buf, sizeof(buf) - 1))== -1) {
            perror("read");
            return 1;
        }
		buf[ret] = '\0';
        printf ("%s", buf);
    }
	return 0;
}




#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>


#define PORT 1025
#define MCAST_GROUP "225.0.0.40"


int
main(int argc, char **argv)
{
	int s;
	char msg[]="MCAST Data!!\n";
	struct sockaddr_in sad;

	if ((s=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
		perror("socket");
		return 1;
	}

	memset(&sad, 0, sizeof(sad));
	sad.sin_family      = AF_INET;
	sad.sin_len         = sizeof(sad);
	sad.sin_addr.s_addr = inet_addr(MCAST_GROUP);
	sad.sin_port        = htons(PORT);
     
	if(sendto(s, msg, sizeof(msg), 0, (struct sockaddr *) &sad, sizeof(sad)) == -1) {
		perror("sendto");
		return 1;
	}

	return 0;
}