我正在调用
STRPCCMD
命令并向其传递一些参数。
该命令需要在 Linux 和 Windows 机器上运行。
有什么方法可以找出用户从哪台机器连接来构建正确的命令?
目前我正在发布两者并忽略错误。
不。
这还不够长,不足以算作答案,让我指出 STRPCCMD 非常有限。
事实上,我对 IBM 将其纳入 ACS 感到震惊。
如果您连接最新的 JDBC 驱动程序,您可以使用
CURRENT CLIENT_ACCTNG
值来获取此信息。
我最近也遇到了这个问题(虽然我在寻找答案时没有找到这个问题)。我确实解决了它,但不是以完全令人满意的方式。
我做的第一件事是在我的应用程序中进行一项设置,以指示客户端是否仅使用 Windows,或者他们可能使用 Windows 或 Linux。如果只是 Windows 则没问题,如果两者都在运行时则辨别哪个。我确实尝试使用 IBM API QDCRDEVD 和 QUSRJOBI 但没有任何结果。我也问了IBM一个问题,他们也没有答案。
最后我执行了这个命令:
strpccmd pccmd('waitfor /t 2 notthere') pause(*yes)
“waitfor”命令是一个 Windows 命令,在本例中将等待 2 秒。 “notthere”是信号的名称(我不想让它有效)。在 Linux 上,此命令立即返回。在 Windows 上,它会等待 2 秒。因此,通过计时响应,我可以确定我们正在运行哪个操作系统。这是我为此编写的 C++ 代码:
static OperatingSystems getHostOperatingSystem() {
bool mixedClients = isMixedClients(); // get the setting
if (!mixedClients) {
return(windows);
}
strPco(); // runs the STRPCO command
int ret = 0;
time_t timeStart = time(NULL);
ret = system(STRPCCMD_WAIT.c_str());
if (ret != 0) {
Qp0zLprintf("Warning: Wait command execution returned %d\n", ret);
}
time_t timeEnd = time(NULL);
double secs = difftime(timeEnd, timeStart);
if (secs < 2) {
Qp0zLprintf("We think the 5250 session is running on Linux\n");
return(linux);
}
Qp0zLprintf("We think the 5250 session is running on Windows\n");
return(windows);
}
此方法的缺点是在 Windows 上会弹出一个空白的 CMD 框 2 秒钟。它会自动消失,但用户会看到它。我想这只需要在每次 5250 登录时发生一次,但确实如此。这是我能做的最好的了。我还向 IBM 提出了变更请求,以便我们可以从 IBM i 代码中发现底层操作系统。