From WikiChip
mirc/on events/on sockwrite
< mirc‎ | on events
Revision as of 22:15, 28 July 2014 by Ouims (talk | contribs)

The ON SOCKWRITE event triggers when data has been sent on a TCP socket. This event allows you to send more data without reaching the limit of the queue.

Note: This event will also trigger when an error occurs on an UDP socket, see here

Synopsis

ON <level>:SOCKWRITE:<matchtext>:<commands>

Parameters

<matchtext>The name of the socket you want event to trigger on.

<commands>The commands to be performed when the event listener's criteria is met.

Writting more

It is possible that the data hasn't sent successfuly, you should be checking for error with {{mIRC|$sockerr} before trying to do anything, here is a list of the possible value for $sockerr in the on SOCKWRITE event:

  • 0 - The data has been written sucessfuly.
  • 3 - Error occurred while trying to send the data, $sock().wsmsg will contain a more specific error message.

Examples

What if you are making a server and you want to close the socket of a client, but you want to warn that client that you are going to close the socket?

You could easily be tempted to use the easy:

/sockwrite -n socket QUIT
/sockclose socket

But this isn't going to work as expected, it might work, it might not work, here is a proper method:

sockwrite -n socket QUIT
set %closesocket 1
...
 
on *:sockwrite:socket:{
;check that all the data has been sent on the socket
  if ($sock(socket).sq == 0) {
    ;if we must close the socket
    if (%closesocket == 1) sockclose socket
  }
}

Here is an example that will use on sockwrite to avoid getting an error because the sending buffer is full.

Let's assume you want to make a script which allows the user to input some text and create a pastebin link from that text using your favorite pastebin website.

The length of the data to be sent would be unknown, to make the script very well, you don't want to send the data line by line, that would be a waste, you want to send the maximum each time.

We are naturally not using a single line otherwise our limit would be of the line length limit of mIRC (4150 bytes).

The limit of the sending buffer being 16384, that's our maximum. A nice method is to write the content to be sent to a file and then to use File handling. After /fopening the file, use $fread(<name>,<N>,<&binvar>) which will fill <&binvar> with N bytes from the current pointer in the file, you can set N here to 16384 to get the fastest sending.

;When you are about to send
var %f content.txt
.fopen handle $qt(%f)
;we check for the return value of $fread because if you get 0, the file is empty and there is nothing to send
if ($fread(handle,16384,&tosend) > 0) sockwrite socket &tosend
 
;and then :
 
on *:sockwrite:socket:{
;if we sent all of the previous content
if ($sock(socket).sq == 0) {
if ($fread(handle,16384,&tosend) > 0) sockwrite socket &tosend
else ;we're done sending the content
}
}

Compatibility

Added: mIRC v3.5
Added on: 07 Aug 1995
Note: Unless otherwise stated, this was the date of original functionality.
Further enhancements may have been made in later versions.


See Also