TCP/IP applications for your PC compatible retro-computers Current version: March 7th, 2020 |
![]() |
2022-03-25: A new mTCP is coming soon! So now would be a good time to send me your bug reports or wishlist items.
2022-01-07:
mTCP is a set of TCP/IP applications for personal computers running
PC-DOS, MS-DOS, FreeDOS, and other flavors of DOS. The applications
include:
mTCP runs on all variants of DOS including IBM PC-DOS, Microsoft MS-DOS, DR-DOS and FreeDOS. All of these applications will run well on the oldest, slowest PC that you can find - I routinely use them on an IBM PCjr made in 1983 because nothing beats the fun of putting a 35+ year old computer on the Internet.
People are using mTCP for goofing off and for real work. If you have a DOS machine that needs to send data across the network mTCP can help you get that done. Besides its utility to vintage computers I have heard of people using it to transfer lab data from dedicated industrial PCs, allowing backups to be run on old machines, and sending sales reports from the branch offices of a retail store to a central server.
Don't have a vintage computer laying around? No problem! mTCP applications will run in a variety of virtual and emulated environments. It has been tested with modified DOSBox builds, VirtualBox, VMWare, and QEMU. See the documentation for the details.
mTCP applications should work on any IBM PC compatible personal computer running DOS. To be more specific:
A packet driver is a utility that lets a program send and receive Ethernet packets using your network card. The packet driver specification is widely supported by both old and new Ethernet cards. If your Ethernet card does not have a packet driver available an NDIS or ODI driver with a "shim" to convert to the packet specification should work but that will require more memory and be slower than having a real packet driver. SLIP and PPP connections are also supported if they use a packet driver that emulates Ethernet. See http://crynwr.com/packet_driver.html for more information on the packet driver specification.
My personal testing includes:
Machines:
This is the official mTCP home page. There are other sites that
mirror
mTCP but only this page guaranteed to have the original, unmodified
binaries. Anything you find on github, ibiblio or other sites is not
verified by me.
| Current version: Binaries and source code
available under the GPLv3 license |
||
| mTCP_2020-03-07.zip | Standard binaries | The mTCP applications and sample files. |
| mTCP_2020-03-07_upx.zip | UPX compressed binaries | The same as above, but the EXEs are compressed to take less disk space. Ideal for floppy based systems. |
| mTCP_2020-03-07.pdf | User documentation | The one true PDF file that will answer all of your questions. |
| mTCP-src_2020-03-07.zip | Source code | Source code and developer documentation for this release. |
Yes, it happens ...
UDP checksums errors are usually a sign of data corruption or bad hardware. Unless there is a bug ...
If you are consistently getting UDP checkum errors then you might be hitting a bug where mTCP requires UDP checksums to be used. UDP checksums are actually optional and just about everything uses them, but I have seen one DNS server recently that did not use UDP checksums. mTCP does not tolerate this and it just throws the packet away with a checksum error.
Your chances on seeing this problem are
very low, but it can happen.
If you have a bad connection that is stumbling due to lost blocks there is a small bug that could make things worse. The bug is exposed when using small TCP window sizes, and it might cause mTCP to take more time to retrain and recover from the missing packets. Your chances on hitting this error are very low.
mTCP was not respecting the remote window size. Specifically, it would not try to send data when the remote window was closed but it could try to send more bytes than would fit if the remote window were open.
If you are usually connecting to fast machines with large buffers this bug probably can not be exposed. Using mTCP to connect to small, slow machines (such as other mTCP machines) might cause an error on connections that transfer a lot of data.
If you think you are hitting any of these problems please see me for
a recompiled mTCP with test fixes applied to it.
mTCP is a hobby project that I started in 2005. While it is only a hobby project, I take pride in my work. If you have a comment, bug, or suggestion for a feature please email me at mbbrutman at gmail.com. I might ask for further information or a trace from the program you are having trouble with. Your bug reports help me make mTCP better for everybody else.
mTCP now has a mailing list! I plan on using it for announcements about new releases, taking bug reports, and general mTCP support. The mailing list has both an email interface and a web interface. You can view it or sign up at https://groups.google.com/g/mtcp. (Non-Gmail users can also participate using email; see the instructions here.)
If you need a change to make mTCP work better for you I am interested in hearing your requirements. I am willing to write custom code if needed, but instead of charging for that service I suggest making a donation to a local animal shelter of your choice. (I have never seen an over-funded animal shelter.) Contact me with what you need and I'll see what I can do. (And thank you to those who have taken me up on this offer!)
Interested in seeing the source code that lets you talk directly to a packet driver? I have taken the lowest layer of the mTCP code and packaged it with a sample application that shows you how to interface a C program with the software interrupt mechanism used by packet drivers. Check it out here: mTCP_tcpacket.html
Jump in! See the mTCP Programming Sample!
All of the applications use the mTCP TCP/IP library which is designed for high performance even on small, slower machines. The code is written in a combination of C++ and assembler. The style of coding is more like "C with classes" to improve the structure of the code with assembler being used in limited areas to improve the performance. The source code is fairly well commented. You can look at it as a framework for writing TCP/IP applications for DOS, complete with plenty of examples.
Features include ARP, UDP, DNS, IP fragments, listen and accept calls for server applications, configurable buffer sizes, automatic retransmit using Karne's algorithm, and run-time switchable tracing for helping you debug. Features may be compiled in or out as needed so that you can minimize the overhead of the TCP/IP library and include only the features that you need. mTCP does not use floating point operations, avoiding the code bloat of the floating point emulation library.
mTCP is designed to be robust. DOS is a challenging environment to work in because quite frankly, it is not much of an operating system. mTCP attempts to minimize problems by using defensive programming techniques. Not every programming error can be prevented, but the library tries to help you where it can. For example, to prevent fragmentation in the DOS heap mTCP generally preallocates pools of objects and manages the objects instead of repeatedly allocating and freeing memory using the DOS heap. The FTP server and the IRC client have been demonstrated to run for days without leaking memory or crashing the machine.
High performance is a key feature of mTCP. The library is written to avoid excess memory copying wherever possible. Assembler is used on some code for both performance and to avoid making expensive library calls that will just invoke BIOS or DOS routines anyway. For the ultimate in performance you can choose to handle raw packets directly in your application layer code, or you can use higher level "send" and "recv" type calls instead. The ability to adjust buffer sizes allows you to balance speed versus memory footprint. Want to see how fast mTCP is? Here are some performance measurements for FTP and for raw socket performance: mTCP Performance notes
mTCP is only available as a library that you link with your application. A TSR version that can be used by software interrupt is not available. While a TSR version would allow more programming environments access to TCP/IP services, it is a much more difficult environment to work in and debug. Performance would also suffer too. It would be an interesting project though - if you want to collaborate on the design for a TSR version of mTCP please contact me.
(For a TCP/IP stack that loads as a TSR see Trumpet by Peter Tattam. Trumpet can usually be found by searching for TCPDRV or NTCPDRV. WATTCP is an older, more widespread TCP/IP stack that can be used as an alternative to mTCP. Neither Trumpet or WATTCP are actively maintained.)
mTCP is developed using Open Watcom, an open source tool chain that supports C, C++, and assembler. Open Watcom is flexible and generates reasonably optimized code. Open Watcom also runs under modern environments such as Windows and Linux so you can develop in the environment of your choice while still generating 16 bit DOS executables. Open Watcom is regularly updated; mTCP is using version 1.9 which was released in June 2010. Porting to other environments such as Borland Turbo C++ for DOS is possible without too much pain. (mTCP originally started with Borland Turbo C++ for DOS.)
People have been extending mTCP and sharing their code. Here are some of the mTCP inspired projects that I know of:
| (Obsolete)
2020-01-01 version: Binaries and
source code released under the GPLv3 license |
||
| mTCP_2020-01-01.zip | Standard binaries | The mTCP applications and sample files. |
| mTCP_2020-01-01_upx.zip | UPX compressed binaries | The same as above, but the EXEs are compressed to take less disk space. Ideal for floppy based systems. |
| mTCP_2020-01-01.pdf | User documentation | The one true PDF file that will answer all of your questions. |
| mTCP-src_2020-01-01.zip | Source code | Source code and developer documentation for this release. |
| (Obsolete) 2015-07-05 version: Binaries only,
source code not distributed |
||
| mTCP_2015-07-05.zip | Standard binaries | The mTCP applications and sample files. |
| mTCP_2015-07-05_upx.zip | UPX compressed binaries | The same as above, but the EXEs are compressed to take less disk space. Ideal for floppy based systems. |
| mTCP_2015-07-05.pdf |
Documentation |
A single PDF file with all of
the documentation. |
| (Obsolete) 2013-05-23 version: Binaries and source code released under the GPLv3 license | ||
| mTCP_2013-05-23.zip | Standard binaries | The mTCP applications, sample files and user documentation. |
| mTCP_2013-05-23_upx.zip | UPX compressed binaries | The same as above, but the EXEs are compressed to take less disk space. Ideal for floppy based systems. |
| mTCP-src_2013-05-23.zip | Source code | The source code to mTCP with design documentation and notes. |
Created July 29th, 2008, Last updated January 11th, 2022
(C)opyright Michael B. Brutman, mbbrutman at gmail.com