Created
June 18, 2025 16:53
-
-
Save Realmlist/da70a922e1c190cddcca5b1b279868d7 to your computer and use it in GitHub Desktop.
COBOL webserver
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| IDENTIFICATION DIVISION. | |
| PROGRAM-ID. WEBSERVER. | |
| DATA DIVISION. | |
| WORKING-STORAGE SECTION. | |
| 01 SERVER-SOCKET PIC S9(9) COMP-5. | |
| 01 CLIENT-SOCKET PIC S9(9) COMP-5. | |
| 01 PORT PIC 9(4) VALUE 8080. | |
| 01 WS-PORT PIC 9(4) COMP-5. | |
| 01 SERVER-ADDRESS. | |
| 05 SIN-FAMILY PIC S9(4) COMP-5 VALUE 2. | |
| 05 SIN-PORT PIC S9(4) COMP-5. | |
| 05 SIN-ADDRESS PIC S9(9) COMP-5 VALUE 0. | |
| 05 FILLER PIC X(8) VALUE LOW-VALUES. | |
| 01 ADDR-LEN PIC S9(9) COMP-5 VALUE 16. | |
| 01 HTTP-RESPONSE. | |
| 05 FILLER PIC X(47) | |
| VALUE "HTTP/1.1 200 OK" & x"0D0A" & | |
| "Content-Type: text/html" & x"0D0A0D0A". | |
| 05 FILLER PIC X(49) | |
| VALUE "<html><body><h1>COBOL Server!</h1></body></html>". | |
| 01 BYTES-SENT PIC S9(9) COMP-5. | |
| 01 STATUS-CODE PIC S9(9) COMP-5. | |
| PROCEDURE DIVISION. | |
| *> Convert port to network byte order using system call | |
| CALL "htons" USING BY VALUE PORT RETURNING WS-PORT | |
| MOVE WS-PORT TO SIN-PORT | |
| *> Create socket | |
| CALL "socket" USING BY VALUE 2 BY VALUE 1 BY VALUE 0 | |
| RETURNING SERVER-SOCKET | |
| IF SERVER-SOCKET < 0 | |
| DISPLAY "SOCKET CREATION FAILED" | |
| STOP RUN | |
| END-IF | |
| *> Bind to port | |
| CALL "bind" USING | |
| BY VALUE SERVER-SOCKET | |
| BY REFERENCE SERVER-ADDRESS | |
| BY VALUE ADDR-LEN | |
| RETURNING STATUS-CODE | |
| IF STATUS-CODE < 0 | |
| DISPLAY "BIND FAILED" | |
| CALL "close" USING BY VALUE SERVER-SOCKET | |
| STOP RUN | |
| END-IF | |
| *> Listen for connections | |
| CALL "listen" USING BY VALUE SERVER-SOCKET BY VALUE 5 | |
| RETURNING STATUS-CODE | |
| IF STATUS-CODE < 0 | |
| DISPLAY "LISTEN FAILED" | |
| CALL "close" USING BY VALUE SERVER-SOCKET | |
| STOP RUN | |
| END-IF | |
| PERFORM FOREVER | |
| *> Accept connection | |
| CALL "accept" USING | |
| BY VALUE SERVER-SOCKET | |
| BY REFERENCE SERVER-ADDRESS | |
| BY REFERENCE ADDR-LEN | |
| RETURNING CLIENT-SOCKET | |
| IF CLIENT-SOCKET < 0 | |
| DISPLAY "ACCEPT FAILED" | |
| EXIT PERFORM | |
| END-IF | |
| *> Send HTTP response | |
| CALL "send" USING | |
| BY VALUE CLIENT-SOCKET | |
| BY REFERENCE HTTP-RESPONSE | |
| BY VALUE LENGTH OF HTTP-RESPONSE | |
| BY VALUE 0 | |
| RETURNING BYTES-SENT | |
| *> Close client socket | |
| CALL "close" USING BY VALUE CLIENT-SOCKET | |
| END-PERFORM | |
| CALL "close" USING BY VALUE SERVER-SOCKET | |
| STOP RUN. | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment