Skip to content

Instantly share code, notes, and snippets.

@Realmlist
Created June 18, 2025 16:53
Show Gist options
  • Select an option

  • Save Realmlist/da70a922e1c190cddcca5b1b279868d7 to your computer and use it in GitHub Desktop.

Select an option

Save Realmlist/da70a922e1c190cddcca5b1b279868d7 to your computer and use it in GitHub Desktop.
COBOL webserver
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