(Released August 6th 2000)
You have a great idea for a killer multi-player Internet game
or multi-user net app, but it's a total pain in the )#$* to
write all the TCP connection and data synchronization code
you'll need to get it going. So you put your idea on the
back-burner and go play "Lemmings" instead. And thus the
Amiga is deprived of a fun Internet app. D-oh! :(
The Solution: (well, okay, it's *a* solution, anyway)
AMarquee is a system that handles all of the icky information
distribution details for you, allowing you to concentrate on
coding your application, rather than on which data goes into
which socket when. AMarquee consists of a shared library and
a TCP daemon, which work together to get your data where it
needs to be. Your program calls simple amarquee.library
functions to broadcast your data, and waits on a provided
MsgPort for data from other hosts. Easy!
Version 49+ of amarquee.library may be used in more serious network
applications too, that cannot use the amarquee protocol, like FTP and HTTP
clients. This in the same easy fashioned way!
Features of amarquee.library (the shared library/API):
- Programs written to use amarquee.library will work transparently
with Inet225, AmiTCP, Miami, or any other TCP stack that is
- Has a simple API that requires no knowledge of multithreading
techniques or socket programming to use.
- Each AMarquee connection you make automatically and transparently
starts a separate background execution thread, so your app will
never have to block while data is sent or received.
- An arbitrary number of AMarquee connections may be active at once.
- Allows you to "subscribe" to data that interests you, so that
when the data on the server is changed you will be automatically
notified. You never need to poll for anything!
- An easy mechanism for sending messages to one or many other
AMarquee clients that are logged into the same server.
- Standard Amiga wildcarding is supported in all applicable functions.
This allows you to easily and succinctly refer to one host or data
item, or many, as appropriate.
- #includes for C, C++, and PCQ Pascal are included.
- ARexx accessible. That is, ARexx scripts can use amarquee.library
through rexxamarquee.library for communications using the same API
that compiled C programs do.
- Example programs in C, C++, Pascal, and ARexx are included.
- Operation is almost totally asynchronous for efficiency, but
several easy synchronization methods are available if you need them.
- Can also be used for direct client-to-client connections and
for making inetd-launched or manually-launched daemon programs.
- Automatically detects when the computer on the other end of
the AMarquee connection has crashed or been shut down, even
on idle connections.
- In addition it can connect to any TCP service, eg. HTTP and FTP, and it will
work in the same easy fashion like any other AMarquee connection.
Features of AMarqueed (the AmiTCP server):
- Works with Inet225, AmiTCP, Miami, or any other TCP stack
that is "AmiTCP compatible".
- Fully multithreaded design, with one server process per connection.
- Re-entrant code, to minimize memory usage.
- Data is stored in a filesystem-like tree structure for simplicity,
flexibility and efficiency. Each client gets its own "home directory"
that it may write to or read from, and each client may also
read from the "home directories" of other clients.
- Efficient design minimizes CPU usage, net bandwidth, and execution time.
- Limits may be put on memory usage, number of connections, and/or
which clients or apps may connect. Only serve the hosts and apps
you want to serve!
- Supports data streaming to one or many clients at once.
- Data streaming and synchronization features let you be sure your
data was read by all interested hosts before you update it again.
- Automatically detects and eliminates "dead" connections (e.g.
if the client computer was shut down without quitting politely)
- Server may be administered remotely by clients with "privileged"
WHAT'S NEW IN VERSION 51.4:
( "-" = new feature, "*" = bug fix)
V51.4: (Public release 06-Aug-2000) (amarquee.library v51.4,
rexxamarquee.library v51.0, AMarqueed v51.0)
* The qm_ActualLen in QMessage could sometimes be wrong with Socket Sessions
This probably didn't cause any trouble because you normally don't use that
* Fixed some rare memory leakage.
- Added a new feature for Socket-Sessions. Previously it was not very easy
to use these sessions. The data received from the other host could be
divided into several QMessages. And you couldn't explicitely tell AMarquee
to return only entire application transfer units. Instead you had to buffer
the data and copy all QMessages containing one transfer unit into your buffer.
To solve this problem I've added a couple of tags to use with
QRAWSESSION_PROTOCOLSTOPHOOK, QRAWSESSION_RECEIVE_EXCEEDING_DATA and
QRAWSESSION_PROTOCOLSTOPHOOK_USERDATA. Now communication with hosts not
using the AMarquee protocol should be as simple as if they did.
Take a look on the new examples named geturl_Hook1.c and geturl_Hook2.c.
* The QNew*Session() and QFreeSession() functions cleared the shared message
port given with the tag QSESSION_SHAREDMSGPORT.
Because of this misfunction there were problems when you created a new or
freed an old session while there were messages waiting in the message port.
You should require at least v.51 of amarquee.library when you use shared
Please understand that only one task, the one which created the shared
message port, may create and free sessions which are bound to the shared
For any sessions please also understand that you must make sure that only
one task at one time use a specific session. This apply to all the Q*Op()
functions, which could be called from several tasks if the calls are
QFreeSession() may only be called from the task which owns the session,
i.e. the task which created the session or have taken over a session with
* There were some trouble if you had set AMARQUEED_ALLOWBROWSE and
AMARQUEED_RESTRICTBROWSE on the AMarqueed server. This bug is fixed in this
version of AMarqueed.
1. If a client program from one host connected more than once to amarqueed,
the new client is supposed to take over and kill the old client. Instead
the old client got killed and the new one failed to connect with error code
QERROR_ACCESS_DENIED (Server Refused Connection).
2. Occasionally the host path set with AMARQUEED_RESTRICTBROWSE got banned
from the server.
Both these problems happened on the AmiComSys/AMarquee server
acs.hostile.cx. The last one occured about once a month. That's the reason
for the recent down times.
- Improved documentation and added a standard autodoc for amarquee.library to
V50.11a: (Public Release 8-Apr-2000) (amarquee.library v50.11,
rexxamarquee.library v50.6, AMarqueed v49.7)
- Added a amarquee.lib for use with vbccm68k C-compiler.
- Modified the AMarquee_protos.h file to make it work with vbcc and other
- AMarquee is Donationware. Now you could register online. See the
distribution section in the guide for more info.
V50.11: (Public Release 19-Mar-2000) (amarquee.library v50.11,
rexxamarquee.library v50.6, AMarqueed v49.7)
- amarquee.library now returns larger packets with a Socket-Session
connection, instead of several small packets.
- Added function QSetMaxRawBufSize() to library. Use it to set the maximum
buffer size that shall be used with a Socket Session. This is the maximum
size of the QMessage you receive. As an option you can use the tag named
QRAWSESSION_MAXBUFFERSIZE with the QNewSocket*Session() call.
- Updated rexxamarquee.library with the new function. Rexxamarquee.library
v.50x requires amarquee.library v.50 or better.
- Modified QNewSession, QNewSessionAsync, QNewHostSession,
They now also take an additional argument with a tag list.
Old programs compiled for v.49 or less will still work.
New programs compiled for v.50 won't work with v.49 or less, so
the minimum version to require with the protos, fd, and pragmas which are
in the v.50+ AMarquee-package is 50.
Old source code using the new header-files must be updated.
- A tag, QSESSION_ERRORCODEPTR, was added. Set it to a pointer to a
LONG-variable where you want the error code to be copied. This is needed
because QNewSession() returns NULL when it fails, i.e. you can't use
QFreeSession() to find out why.
- Dropped support for the INET225 version of amarquee.library. Is anybody
using it? - Changed the error code which is returned by QFreeSession() or
copied to the QSESSION_ERRORCODEPTR variable when a connection to a server
When the QNewSocketSession(Async) function is used the return code is
QERROR_NO_TCPSERVER instead of QERROR_NO_SERVER. -
QCreateSharedMessagePort(), QDeleteSharedMessagePort() functions added to
- Added the tag QSESSION_SHAREDMSGPORT.
- Added example amarqueesharedmp.c to show how to use the new shared message
* The qm_Path of the QMessage received when a asynchronious connection have
been established only contained the host name. It shall also contain the
program name, like /hostname/progname, when QNewSessionAsync() was used.
- AMarqueed was not updated in this release.