用两台QNX虚拟机实现使用Qnet服务发送消息

Qnet通信基本原理如下图所示:
在这里插入图片描述
启动Qnet有两种方式:

  1. 在/etc/system/config目录下建立文件useqnet,待重新启动qnx或之后每次启动qnx后,系统中的/etc/system/sysinit脚本会自动启动Qnet服务。
  2. 在命令行直接启动。在命令行输入下列代码:$ io-pkt-v4 -del900 -p qnet & 即可。

在启动Qnet功能之后,会在根目录下自动生成一个\net文件夹,里面可以查看网络中所有机器的文件,并对所有文件进行操作。

下面在Qnet环境下实现两台qnx机器“server-client”模型的通讯。

qnx-server代码:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/neutrino.h>
#include <errno.h>

//server demo
int main (void)
{
    int rcvid;		// 回复ID
    int chid;		// 通道ID
    int pid;			// 进程ID
    char message [512];//接收的消息
    const char str[80];//写入文件的字符串

    int ret;

    FILE *fd;
    fd = fopen("server.txt","w");//创建或打开一个含server进程ID和通道ID的文件

    //创建一个通道
    chid = ChannelCreate (0);//获取通道ID
    pid = getpid();//获取进程ID

    sprintf(str,"%d  %d\n",chid,pid);//写入字符串
    ret = fputs(str,fd);//写入进程ID和通道ID到server.txt中
    fclose(fd);

    printf("ret = %d\n",ret);
    printf("chid = %d,pid = %d,fd = %d,str = %s\n",chid,pid,fileno(fd),str);

    // 接收消息并输出
    rcvid = MsgReceive (chid, message, sizeof (message),NULL);
    printf ("Got a message, rcvid is %X\n", rcvid);
    printf ("Message was \"%s\".\n", message);

    // 回复消息
    strcpy (message, "Hello! This message is from the server.");
    ret = MsgReply (rcvid, EOK, message, sizeof (message));
    if(ret != 0)
    	printf("Reply error.");

    return 0;
}

在qnx-server下运行上述代码,效果如下:
在这里插入图片描述
结果显示写入通道ID=1,进程ID=835620到“server.txt”中成功,此时server进程阻塞在MsgReceive(…)函数,等待client发送消息接触阻塞。

现在来看一下qnet-client端的代码:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/neutrino.h>
#include <errno.h>

//client demo
int main()
{
	int nd_server, len;//qnet节点ID
	char path_server[50] = "/net/server";//要通过qnet连接的qnx机器
	char str[80];

	int chid;		// 通道ID
	int pid;			// 进程ID

	char *smsg = "This message is from the client.";//要发送的消息
	char rmsg [200];//接收的回复消息
	int  coid;//连接通道返回的连接ID

	nd_server = netmgr_strtond( path_server, NULL);//获得client的节点ID
	if (nd_server == -1) {
		perror ("netmgr_strtond" );
		return EXIT_FAILURE;
	}
	else {
		printf ("Server node id for %s is %d.\n", path_server, nd_server);
	}

	FILE *fd;
	fd = fopen("/net/server/server.txt","r");//打开server.txt读取通道ID和进程ID用于后续的连接
	fgets(str,150,fd);
	fclose(fd);
	sscanf(str,"%d  %d",&chid,&pid);
	printf("chid = %d,pid = %d,fd = %d\nstr = %s\n",chid,pid,fileno(fd),str);

	// 和服务器建立连接
	coid = ConnectAttach (nd_server, pid, chid, 0, 0);
	if (coid == -1) {
		fprintf (stderr, "Couldn't ConnectAttach to it\n");
		perror (NULL);
		exit (EXIT_FAILURE);
	}
	else
		printf("coid = %d\n",coid);

	// 给服务器发送消息
	if (MsgSend (coid,
			smsg,
			strlen (smsg) + 1,
			rmsg,
			sizeof (rmsg)) == -1) {
		fprintf (stderr, "Error during MsgSend\n");
		perror (NULL);
		exit (EXIT_FAILURE);
	}

	if (strlen (rmsg) > 0) {
		printf ("It returns \"%s\"\n", rmsg);
	}

	return 0;
}

在qnx-client下运行上述代码,效果如下:
在这里插入图片描述
结果显示成功获取了qnx-server的节点ID和服务器的进程ID、通道ID,得到的连接ID=3,并收到服务器回复的消息。此时服务器端解除阻塞,效果如下:
在这里插入图片描述
结果显示服务器收到了消息,并将收到的消息打印了出来。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值