Hello Javier,
Am 11.10.2024 um 19:45 schrieb datil400 <datil400@xxxxxxxxx>:
I am interested in conveniently configuring a user-defined tcp server.
Programming is not configuring. :-)
Development of custom TCP server is *almost* the same as doing the same on Linux. Keyword is "socket programming". Searching for that should let you participate in the huge amount of examples and explanations how to do this on Linux.
Personally, I prefer to use C for that purpose, because one will find truckloads of examples in the net for that language. You can do it in RPG, though. Search for Scott Klement's socket tutorial.
For some IBM i centric introduction to C, I recommend having a look at Chris Hird's "Let's C" series of blog entries:
https://www.shieldadvanced.com/Blog/lets-c/
I have done a simple UDP (not TCP) server project myself, because this spares me to tackle with fork() vs. spawn() and lessens overhead for TCP session establishment.
https://github.com/PoC-dev/asterisk-translate-clid
Things to keep in mind:
- IBM i is a native EBCDIC platform. The existing services from IBM transparently do translation from EBCDIC to ASCII and back for e. g. http, ftp, ssh, you name it. You'll need to do this yourself when programming your own server.
- Many TCP examples for Linux heavily rely on the fork() call to free the initial connection and thus enable parallel processing. IBM i doesn't have fork, but spawn() which is different but serves a similar purpose. See "UNIX C Applications Porting to AS/400" (SG24-4438) and "UNIX C Applications Porting to AS/400 Companion Guide" (SG24-4938) for details. Note: I have not yet understood in detail how to use spawn() as a fork() replacement.
- Using PFs/LFs (Record I/O) is somewhat cumbersome in C.
- You may want to use your own subsystem (description) and start it in qstrup to autostart your application as a background (batch) job.
- You may want to add a signal handler to have your application terminate cleanly when the SBS is ended.
- You can choose to leave aside all network programming and SBS hassle, and use inetd instead — which is conviently available in IBM i also. Your program just uses stdin/stdout to communicate with the network peer, while inetd takes care about spawn() and network stuff.
https://en.wikipedia.org/wiki/Inetd — Note: This still must do the EBCDIC <=> ASCII translation yourself. Also, inetd launches your application on every single incoming request. This adds a notable CPU overhead and delay when used on very low end machines.
Does that help?
:wq! PoC
As an Amazon Associate we earn from qualifying purchases.