有什么方法可以知道客户端是从哪个操作系统连接的?

问题描述 投票:0回答:3

我正在调用

STRPCCMD
命令并向其传递一些参数。

该命令需要在 Linux 和 Windows 机器上运行。

有什么方法可以找出用户从哪台机器连接来构建正确的命令?

目前我正在发布两者并忽略错误。

ibm-midrange rpgle jt400 control-language
3个回答
2
投票

不。

这还不够长,不足以算作答案,让我指出 STRPCCMD 非常有限。

事实上,我对 IBM 将其纳入 ACS 感到震惊。


0
投票

如果您连接最新的 JDBC 驱动程序,您可以使用

CURRENT CLIENT_ACCTNG
值来获取此信息。


0
投票

我最近也遇到了这个问题(虽然我在寻找答案时没有找到这个问题)。我确实解决了它,但不是以完全令人满意的方式。

我做的第一件事是在我的应用程序中进行一项设置,以指示客户端是否仅使用 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 代码中发现底层操作系统。

© www.soinside.com 2019 - 2024. All rights reserved.