套接字和COBOL

5
我在一家医院得到了一份工作,该医院仍然使用COBOL进行组织工作,整个(现在有20TB)数据库(猜猜是用什么制作的?没错,是COBOL)中充满了自过去45年以来每个患者的数据。
这就是我的故事。现在是我的问题:
目前,所有套接字都是由COBOL程序将其数据写入文件实现的(根据我所见)。然后,这些文件被C ++程序读取(这是在1980年代末添加的另一个模块),并使用C ++套接字发送到数据库。
现在这个解决方案已经停止工作了,因为他们正在将数据库从COBOL移动到COBOL,是的-他们没有使用MySQL或其他数据库-他们在COBOL中实现了一个新的数据库。我问了在我之前工作的那个人(他现在大约70岁)为什么要这样做,他告诉我他非常擅长COBOL,不想用其他语言编写它。
到目前为止还好,现在是我的问题:
如何在COBOL中实现套接字连接?我需要创建一个与外部COBOL数据库的接口,例如192.168.1.23:283

1
我非常同情你。有人在这里犯了一个大错误,他们需要将数据移出去,让这位70岁的老人体面地退休。如果他们拖延时间,这将会花费他们一笔巨款来解决问题。 - James Westgate
问题就像是……COBOL消失了,就好像每个人都想把它从他们的眼中移除一样。我甚至找不到官方文档之类的东西。如果不知道如何在其中实现套接字,我就无助了。 - kati
1
我想我可以帮忙……但我需要更多信息。COBOL程序托管在哪里?执行环境是什么(Micro Focus、IMS over IBM OS/2、CICS over zOS)、编译器等等。但这里的主要信息是:你不能在COBOL中实现sockets,就像你不能在C/C++中实现它一样。你必须依赖于你的环境来实现。 - Bruno Brant
我会说“套接字不可能。该死!我猜我们得用MySQL了。” - Earlz
我认为你需要探索一下现在的做法,因为你写道“他们正在将数据库从COBOL转移到COBOL”...而COBOL并没有实现数据库...环境才有。请提供机器、操作系统和编译器版本的名称。 - Dr. belisarius
1
COBOL并没有从存在中消失。在(插入主要银行名称)的计算机部门四处逛逛吧。 - Alan B
5个回答

5
您需要提供更多关于您的操作系统和编译器的信息。
如果您正在使用支持语言环境的编译器的IBM z/OS,则可以直接从z/OS通信服务调用EZASOCK函数。这些调用在其参考文献中有很好的文档记录和Cobol示例。
其他平台将有其他选项。
在大多数情况下,您可以只是“调用”一个外部模块,该模块可用任何所需的语言编写,但可能是DLL或sharedLib等。
您能否提供有关您的环境的更多详细信息?
为什么不直接从Cobol程序向数据库编写?

1

IBM主机有两个套接字API可用于COBOL。一个用于在CICS程序内使用(其中有特殊的线程安全和环境考虑),另一个用于在普通批处理或IMS程序中使用。

完整的TCP/IP功能已实现,足以可靠地处理符合MVA标准的信用卡协议(我知道,因为我已经做过了)。


0
大多数COBOL编译器都允许您链接和调用目标模块或DLL。正如Kati所说,我知道我可以帮忙,但需要额外的信息。我之前从Windows到DEC进行过这样的操作,所以我知道它是可行的。

0

记得谷歌是你的好朋友。

答案将严重依赖于您的执行环境。

IBM 声称在 z/OS 的 CICS 中有可从 COBOL 调用的 Sockets API

Micro Focus 似乎也有相关内容。


你几乎总是可以从COBOL调用外部子程序。如果OP能够提到环境,我相信这里会有人可以帮忙。 - Dr. belisarius

0

COBOL不支持套接字(从技术上讲,一些COBOL环境有各种非标准的COBOL套接字库)。

相反,您需要使用C编写任何功能,然后从Cobol中调用它。

如果您使用的是Linux系统,例如GNU Cobol 3,则按照以下说明进行操作:

COBOL-C-Python TCP通信指南

该项目演示了使用COBOL和C组合实现的简单TCP服务器。COBOL主程序将一个端口号传递给一个名为start_server的C函数,该函数在提供的端口上设置一个基本的TCP服务器进行监听。单独的Python脚本充当客户端向此服务器发送消息。

Ubuntu 22.04设置说明

先决条件

  1. 安装COBOL编译器: OpenCOBOL(也称为GnuCOBOL)是一个免费的COBOL编译器。安装步骤如下:

    sudo apt update
    sudo apt install gnucobol3
    
  2. 安装GCC: GCC是一款流行的C编译器,我们将用它来编译项目中的C部分。

    sudo apt install build-essential
    
  3. 安装Python: 您还需要Python来完成项目的客户端部分。请安装Python 3和pip:

    sudo apt install python3 python3-pip
    

项目文件

  1. COBOL文件(TCPServer.cob)

    IDENTIFICATION DIVISION.
    PROGRAM-ID. TCPServer.
    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 SERVER-PORT            PIC 9(5) COMP VALUE 8080.
    
    PROCEDURE DIVISION.
        DISPLAY "即将调用C函数。"
        CALL "start_server" USING SERVER-PORT.
        STOP RUN.
    
  2. C文件(server.c)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    
    void start_server(int* port_ptr) {
        unsigned char* bytes = (unsigned char*)port_ptr;
        printf("字节: %02x %02x %02x %02x\n", bytes[0], bytes[1], bytes[2], bytes[3]);
        const int port = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
        printf("在端口 %d 上运行TCP服务器\n", port);
        fflush(stdout);
        // ... [你的代码的其余部分]
    }
    
  3. Python客户端(client.py)

    import socket
    
    def send_message_to_server(host, port, message):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.connect((host, port))
            s.sendall(message.encode())
    
    if __name__ == "__main__":
        HOST = "127.0.0.1"
        PORT = 8080
        MESSAGE = "来自Python的问候!"
        send_message_to_server(HOST, PORT, MESSAGE)
    
  4. 编译脚本(compile.sh)

    gcc -c server.c
    cobc -x TCPServer.cob server.o -lc
    

步骤:

  1. 创建项目文件: 使用类似于nano的文本编辑器在目录~/cobol_tcp中创建上述每个文件。

  2. 编译代码: 首先,将编译脚本设置为可执行,并运行它。

    chmod +x compile.sh
    ./compile.sh
    
  3. 运行TCP服务器

    ./TCPServer
    
  4. 运行Python客户端: 在另一个终端中,导航到包含client.py的目录并运行:

    python3 client.py
    
如果一切设置正确,服务器(COBOL+C代码)将显示来自Python客户端的接收到的消息。
工作原理如下:
1. COBOL程序初始化一个端口值(8080),并调用C函数(start_server)传递该端口。 2. C函数(start_server)设置一个TCP服务器并等待传入连接。 3. Python脚本连接到服务器并发送一条消息。 4. C函数接收消息,显示它,然后程序结束。
就是这样!这个项目展示了COBOL、C和Python在基本的客户端-服务器通信设置中的互操作性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接