From WikiChip
Editing mirc/commands/sockread
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
This page supports semantic in-text annotations (e.g. "[[Is specified as::World Heritage Site]]") to build structured and queryable content provided by Semantic MediaWiki. For a comprehensive description on how to use annotations or the #ask parser function, please have a look at the getting started, in-text annotation, or inline queries help pages.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
− | {{mirc title|/sockread Command}} | + | {{mirc title|/sockread Command}}{{mIRC Guide}} |
The '''/sockread''' command reads bytes from the receive buffer of a socket connection into a specified variable. This command must be and is to be used inside socket events. | The '''/sockread''' command reads bytes from the receive buffer of a socket connection into a specified variable. This command must be and is to be used inside socket events. | ||
Line 20: | Line 20: | ||
== Switches == | == Switches == | ||
− | + | {| class="wikitable" style="line-height: 25px; margin-left: 75px;" | |
− | + | |- | |
+ | ! Switch !! Description | ||
+ | |- | ||
+ | | '''f''' || When reading a terminated line (/sockread %var or /sockread -n &var), forces mIRC to fill the variable with whatever text is in the receive buffer, even if it does not end in a terminated line. | ||
+ | |- | ||
+ | | '''n''' || Reads a terminated line into a {{mIRC|binary variables|&binvars}}. If the incoming line does not contain a terminated line, no byte will be read into the {{mIRC|binary variables|&binvars}}, unless you specify the '''-f''' switch. | ||
+ | |} | ||
== Parameters == | == Parameters == | ||
− | + | {| class="wikitable" style="line-height: 25px; margin-left: 75px;" | |
− | + | |- | |
+ | ! Parameter !! Description | ||
+ | |- | ||
+ | | '''[numbytes]''' || The number of bytes to read from the receive buffer. | ||
+ | |- | ||
+ | | '''[%var/&binvar]''' || The name of the variable to read the socket buffer into. | ||
+ | |} | ||
== Reading == | == Reading == | ||
Line 34: | Line 46: | ||
b) you were reading into a %var and there is still a terminated line in the buffer waiting to be read. | b) you were reading into a %var and there is still a terminated line in the buffer waiting to be read. | ||
− | This means you will miss the last line if it is not a terminated line and you are reading line by line only | + | This means you will miss the last line if it is not a terminated line and you are reading line by line only. You can read that line in the on sockclose event, {{mIRC|/sockread#Last line not showing up|see below}}. |
'''Note''' (fixed since mIRC 7.36): Using SSL, on sockread might not be retriggered as it should, {{mIRC|on events/on sockclose|on sockclose}} will be triggered too early with $sockerr sets to 3, you must read the receive buffer from that event | '''Note''' (fixed since mIRC 7.36): Using SSL, on sockread might not be retriggered as it should, {{mIRC|on events/on sockclose|on sockclose}} will be triggered too early with $sockerr sets to 3, you must read the receive buffer from that event | ||
Line 75: | Line 87: | ||
}</source> | }</source> | ||
− | And that, assuming what you are looking for is not on the last non terminated line (which would be missed because -f is not there | + | And that, assuming what you are looking for is not on the last non terminated line (which would be missed because -f is not there), should be fine. In fact, in this specific example and in general, it will work, because you are making sure %a is a full line or nothing. Well that's why it works in most situation, you are checking that %a is a specific text, which would fail if no byte were read into %a because a terminated line couldn't be found. However, if you are in a situation where you must check that %a is $null (usually because it read an empty $crlf line), you must check {{mIRC|$sockbr}} to know if you read bytes at all, a good example of this usage is shown below, which discard the headers of HTTP (check for an empty value after /Sockread %a reads an empty $crlf line): |
<source lang="mIRC"> | <source lang="mIRC"> | ||
Line 178: | Line 190: | ||
'''Note2''': too long line will produce an error. | '''Note2''': too long line will produce an error. | ||
− | '''Note3''': Using SSL, the on sockread event might not be triggered though it should, you must read the rest in the on sockclose event (has been fixed since mIRC 7. | + | '''Note3''': Using SSL, the on sockread event might not be triggered though it should, you must read the rest in the on sockclose event (has been fixed since around mIRC 7.32). |
<source lang="mIRC">ON *:SOCKREAD:mySocket:{ | <source lang="mIRC">ON *:SOCKREAD:mySocket:{ | ||
Line 218: | Line 230: | ||
else { | else { | ||
var %a | var %a | ||
− | + | ||
− | ; | + | ;when we start, the next line is the chunk size, but after reading a chunk, we must parse the $crlf ending that chunk |
− | while ($sockbr) && (%a == $null) { sockread %a } | + | ;so if we read and %a is $null, it means we are after the start, we try to read the next line, if we can't find the next chunk in the current receive buffer, we return and allow the event to retrigger with more data. |
+ | sockread -f %a | ||
+ | while ($sockbr) && (%a == $null) { sockread -f %a } | ||
if (!$sockbr) || (%a == $null) return | if (!$sockbr) || (%a == $null) return | ||
;last chunk | ;last chunk |