SimpleIRC Protocol

SimpleIRC Protocol for CSIS 440 (Computer Network Software Concepts), Spring 2010

———————————————————————————————————————————————————

CSIS 440's
  _____ _                 _      _____ _____   _____
 / ____(_)               | |    |_   _|  __  / ____|
| (___  _ _ __ ___  _ __ | | ___  | | | |__) | |
 ___ | | '_ ` _ | '_ | |/ _  | | |  _  /| |
 ____) | | | | | | | |_) | |  __/_| |_| |  | |____
|_____/|_|_| |_| |_| .__/|_|___|_____|_|  _\_____|
                   | |
                   |_|

– SimpleIRC Protocol –

* Purpose

Explaination and specification of the SimpleIRC protocol for CSIS 440, Spring 2010.

* Constants

  • MAX_CLIENTS_CONNECTED = 20 users
  • MAX_NICK_LENGTH = 8 characters
  • COMMAND_LENGTH = 4 characters
  • MAX_MESSAGE_LENGTH = 256 – COMMAND_LENGTH – MAX_NICK_LENGTH – 3
    • 256 as required by Walker
    • minus COMMAND_LENGTH,
    • minus MAX_NICK_LENGTH,
    • Three more characters off for:
      • A space between NICK and COMMAND,
      • A colon (:) between RESULT and COMMAND,
      • A terminating newline (for when a message sends)

* Commands

These are the raw commands that the protocol will send, but not exactly what the client (in the UI) will use.

::- Summary ::

  • MESG
    • Sends a message to the server to relay to others
  • QUIT
    • Disconnects the client gracefully
  • JOIN
    • Message sent by the server when a client joins the room
  • NICK
    • Changes the nickname of the client requesting the new nick

:: Command Format ::
Client sends == <COMMAND>:<RESULT>
Server sends == <NICK> <COMMAND>:<RESULT>

– Full explaination –
Command Name (UI Command Example)
Command structure
Server reply structure (if needed)
-Explaination of what it does
- Example of usage

MESG (No command given, automatically assumes sending a MESG)
MESG :<MESSAGE>
<NICK> MESG:<MESSAGE>n
- Represents a message being sent from a client.
- C-> MESG:Hi folks!
- S-> MyNick MESG:Hi folks!n

NICK (/nick <NewNick>)
NICK :<NewNick>
<OldNick> NICK:<NewNick>n
- Changes the nick of the user connected
- C-> NICK :NewNick
- S-> MyNick NICK:NewNickn

JOIN (No command given, sent from server only)
No message is sent by the client, this is a server only message.
<NICK> JOIN:<NICK>:<IP>:<PORT>n
- Shows a user connecting to the room. This is set at user connect time (post-NICK)
- S-> MyNick JOIN:MyNick:1.1.1.1:50000n

QUIT (/quit <QUIT MESSAGE>)
<NICK> QUIT:<QUIT MESSAGE>
<NICK> QUIT:<QUIT MESSAGE>n
- Represents a client disconnecting from the server.
- C-> MyNick QUIT:
- S-> MyNick QUIT:n
OR
- C-> MyNick QUIT:Bye!
- S-> MyNick QUIT:Bye!n

* Comments / Requirements

  • All messages sent by a client to the server will be sent back to the client from the server.
    • Example, “MESG :<MSG>” command is used, the resulting string “NICK MESSG :<MSG>n” is sent back to the client. This is a way to verify that all messages made it to the server, and allows the server to just send all messages to ALL connected clients.
  • All server messages MUST be newline terminated. Still no null terminated.
  • No client message must be newline terminated. Is friendly, but not required.
    • No null terminator.
    • Handle this appropiately (grab until out of characters or max length).
  • Any messages overflowing the MAX_MESSAGE_LENGTH will be segmented _by the client._
    • If the client sends more than the MAX_MESSAGE_LENGTH, it will be dropped and ignored.
    • If the client sends 500 bytes of data, the server takes MAX_LENGTH_LENGTH and will look at the rest on the next run. If there is no valid command in that segment, the server will ignore that segment. There _must_ be a valid command _everytime._
    • The client must handle fragmentation/segmentation of a message. Server only handles the MAX_MESSAGE_LENGTH.
  • The output for any message from a User is only their nickname, and not both their Nick and IP. For example, “<MyNick> Hi there guys!”
  • All messages sent to the server will be responded to by the server to the client.

* What the client prints off of the server’s messages

  • A client will print the Nick, the IP, and Port number associated with a user when they connect, using the server information (JOIN command). (Based off of Walker’s requirement)
    • Example:  Nick:IP:Port connected
  • A client will print a Quit message, received from the server, along with quit message.
  • If the client connects to a full server, the server will close the connection and the client will have to close the connection.

* Example

= C is the client, S is the server =
C connects (socket, connect)
C -> NICK :Bob                        | Client requests nick 'Bob'
S -> Bob NICK:Bobn                   | Server acknowledges nick 'Bob' as valid (not in use) (server forcing the nick)
S -> Bob JOIN:Bob:1.1.1.1:48500       | Server tells client that Bob is connected
S -> Fred JOIN:Fred:1.1.2.1:50000     | Server tells client that Fred is connected
--- Chat occurs
C -> MESG :Hi folks!                  | Client sends message to server (<MESSAGE> = Hi folks!)
S -> Bob MESG:Hi folks!n             | Bob's message is sent to him, and everyone else connected.
S -> Fred NICK:Fred2n                | Fred changed his nick to "Fred2"
C -> NICK:RobertTheBest               | Bob requests nick "RobertTheBest"
S -> Bob NICK:RobertT_                | Server forces the nick "RobertT_" due to over MAX_NICK_LENGTH
--- Client is going to disconnect
C -> QUIT :Bye guys!                  | Bob quits with the quit message, "Bye guys!"
S -> Bob QUIT:Bye guys!n             | Bob's quit is sent to him, and everyone else
S closes connection on its end
C connection is closed. Is disconnected.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>