|KuTsuM - Sat Oct 08, 2005 2:52 pm
This tutorial requires atleast basic knowledge of mIRC. If you don't have at least that, come back when you do. Also, at the end of this tutorial will be a working IRC SocketBot that you can mess with :)
Q. What is a socket?
A. A socket is one form of creating a two way communication link between two systems connected to the internet, using Windows' WinSock, and WinSock2 libraries.
Q. What is an IP?
A. IP stands for Internet Protocol. It's used for passing information between two systems. Each system has it's own unique number called their IP.
Q. What is TCP?
A. TCP stands for Transmission Control Protocol, and is used along with the Internet Protocol for passing packets of information.
Opening Connections with Sockets
mIRC Help wrote
/sockopen [-de] [bindip] <name> <address> <port>
The sockopen alias is used to tell mIRC to open a connection to the specified network. To do this, we need all of the following parameters:
Switches [-de] - The -d switch specifies that you have declared bindip as the address to bind to. The -e switch (new in mIRC 6.17), declares that the socket be opened over an SSL connection. These switches are optional.
Name - This parameter is the socket's name. Each open socket must have a unique name. This is used to pass information between the systems, while being able to use other sockets simultaneously.
Address - This parameter is the IP(IE: 127.0.0.1) or host(IE: www.hawkee.com) of the system you would like the socket to connect to.
Port - This parameter is the remote system's port number you wish to connect to. There are millions of port numbers, but you must connect to the one that is currently listening(For example, if you wanted to connect to a website, you'd use port number 80, if you wanted to connect to a typical IRC server, the common port is 6667). For a list of the popular ports, go to Here
When you use the sockopen alias, you must follow it with the SOCKOPEN event. This is used to send information to the remote system immediately after the connection is made. This is needed for getting authorized with the majority of all servers. For example, with IRC you need to pass the 'USER' and 'NICK'information along with respond to a 'PING' packet with a 'PONG'.
The SOCKOPEN event calls for 1 detail, and that's the sockets name. The event is read like this
Putting it all together, It's done like this:
mIRC Help wrote
/sockwrite [-tnb] <name> [numbytes] <text|%var|&binvar>
The sockwrite alias is used to send information through the socket. There are 2 parameters needed. Name and either the Text you'd like to send (this can be in a variable) or a binary variable (or binvar).
By now you should know what a variable is. If not, a variable is a string of information either publicly or privately saved by mIRC for later retrieval.
A binary variable is basically the same thing, except it is used to store a string of Binary (A computer language used to pass information between systems, consists of only 1's and 0's [heard that before? ;)]). Binary variables are generally used for uploading or downloading files such as .exe, .mp* (1,2,3,4), .dll, etc.
-n - The n switch is very important. It will tell mIRC to append a CrLf to the end of the information, if there isn't one already. CrLf tells the remote system to create a new line (Used so 2 packets will not be blended together like so:
That's how it should be, and will do with CrLF
at the end. But this is without:
USER informationNICK information)
-t - The t switch specifys that the information being sent is not a binary variable. This means that something like "You &me" is not evaluated and will be treated as just text.
-b - The b switch tells mIRC that you want to set a limit in size of the packet (basically). The information that you tell it to send will be limited to the byte size you specify in the "[numbytes]" parameter
Name - This, of course, is the specified socket name set earlier when opening the socket.[/color]
Text/%var/&binvar - Pretty much as it sounds, and as explained above.
Putting this information with the previous code, looks like this:
Also, each sockwrite event triggers the SOCKWRITE event (This is optional, and only needed if you want to run certain commands whenever information is sent)
SOCKWRITE works the same way as the SOCKOPEN event.
Reading Information Received from Remote System
These functions are very vital to using sockets. It allows you to create a 2-way communication between the remote system (Like decimating ignorance :).. sorry).
This is done with the SOCKREAD event. In which, again, uses the same parameters as the SOCKOPEN and SOCKWRITE events. It also uses the sockread alias.
mIRC Help wrote
/sockread [-fn] [numbytes] <%var|&binvar>
-f - The f switch tells mIRC you'd like to put the received string of information into a variable, even if it does not contain a CrLf.
-n - The n switch tells mIRC to check the string for a CrLf. If there is a CrLf, it will place the information in the specified &binvar (binary variable). If it doesn't, mIRC will do nothing with the string. If the two switches are put together mIRC will place the string into a binary variable even if there is no CrLf.
%var/&binvar - Exactly as it sounds. Either place a variable that you'd like to hold the string, or the binary variable with the above switches.
Example with the above codes:
Closing sockets is very important. No matter what you do, sockets will always remain open unless the remote system closes. Sockets use up 'bandwidth' and as mIRC says, it's a very limited resource. Closing sockets is done by the sockclose alias.
mIRC Help wrote
After all the above information, this is rather self-explanitory.
Name - The name of the socket, as specified earlier, of course.
Of course, this triggers the SOCKCLOSE event. You can use this event to run commands whenever a socket by the specified name is closed.
Used with the above code, as usual:
Socket Marking is used for your own use. It is able to contain a string of up to 512 bytes (Something like 51 characters, I'm not sure). You can use this information for retreive from sockets, while allowing the ability to avoid the use of variables.
Socket renaming is done so you can open the current socket's name for use, and gives this socket a more desired name. This is all done without having to close the connection and reopen it :)
Pausing Incoming Data (Added in mIRC 6.17)
Pausing the sockets are used to ignore any information being recieved by the socket temporarily, until told to begin listening again.
-r - This switch indicates that mIRC should restart the socket listening to data. This means incoming information will no longer be ignored. If this switch is not identified, then mIRC will begin ignoring information.
Now, we have all the basic required elements out of the way. We can begin to get a little bit more in-depth. ;D
mIRC Help wrote
This returns information about a socket connection that you created using the socket commands.
Properties: name, ip, port, status, sent, rcvd, sq, rq, ls, lr, mark, type, saddr, sport, to, wserr, wsmsg, bindip, bindport
The Sock() function is used like this:
Name - The name prop is used to retreive the sockets name. This can also be done with the $sockname identifier.
IP - The ip prop is used to retreive the Internet Protocol number of the remote system.
Port - The port prop is used to retreive the local port being used by the socket.
Sent and Rcvd - The sent prop is used to show the number of bytes sent to the remote system, and the rcvd prop is used to show the number of bytes received from the remote system.
Sq and Rq - The sq prop is used to see how many bytes sent are being que'd (Held until it's able to send the information). The rq prop is used to find out how many bytes received are being que'd before running their commands. This is used so that information is not missed at all.
Ls and Lr - The ls prop tells you how long it's been since you last sent information, and the lr is the same but since you last received information.
Mark - The mark prop tells you the information (512 bytes max.) that was saved earlier by using the sockmark alias.
to - The to prop shows how long the socket has been connected to the remote system
wserr - The wserr prop shows the last WinSock error number.
wsmsg - The wsmsg shows the WinSock error message that corresponds with the error number.
ssl - The ssl prop returns $true or $false whether the socket is opened over an SSL connection or not (specified in /sockopen). [Added in version 6.17]
pause - The pause prop returns $true or $false depending on whether or not the socket has been paused from receiving incoming data (specified in the /sockpause alias, which was added in mIRC 6.17). [Added in version 6.17]
- Other Identifiers
$sockerr - This is used to tell you if there has been an error within the socket. If there has been an error, it will set a value. If there hasn't, the value will be null.
$sockbr - This identifier returns the number of bytes in size that the last string received was.
$portfree(<port number>) - This will tell you if the specified port is not being used. This is more oftenly used with listening sockets (Will be learned next), because mIRC doesn't allow you to listen on a port already being listened to.
Creating a Server with Sockets (Listening Sockets)
Listening sockets is used for creating servers so that other's may connect to you. With the time and dedication, you can create anything from FTP servers, IRC servers, HTTP servers, etc.
Listening sockets are done with just the socklisten alias, and the SOCKLISTEN event.
The socklisten alias is needed before the socklisten event can be used:
The SOCKLISTEN event is triggered whenever a remote system attempts to connect. This, also, uses the sockaccept alias.
The above code will listen to the socket named server, and when a connection is attempted, it will accept the connection and name it "client."
But what if you want to read for specific information to be retreived from the client, or remote system? This is easy. You can pass information between the client and server easily with the SOCKREAD event and sockwrite alias.
As I promised, here's a little socketbot code to practice with. To connect to an IRC server, type /connect host port (just the same as you'd use /server). Type /cquit to quit the server
For more information on IRC Protocol, view the RFC 1459, here.
Please notify me of any informations, or other errors therefor and I will replace them :)
P.S. I wrote this tutorial on TCP sockets only, not UDP. Reason being I am not familiar with UDP, and you'll have to find that on your own time. Sorry ;/
Last edited by KuTsuM on Tue Sep 30, 2008 2:02 am; edited 7 times in total