Jump to content

TCP File Transfer questions


Recommended Posts

I'm building an application pair to automate the transfer of files from my computer at work out to multiple PCs. I have the TCPSend and Recv stuff down, but I'm getting a bit bogged down on the methodology to send. When using TCPSend with large amounts of data, it will send only pieces of the data at a time. I know how to do that as well. What I'm trying to do, however, is follow a suggestion made by Larry in his post of basic binary file transfer, which is to give each bit of the message a header that lists the size of that particular part. TCPSend doesn't return that data till AFTER it's been sent, so then a header to go BEFORE the message would be useless. I can easily split the data up manually, I'm just not sure how big to make each data "blob".

As another option, I could just send the total size of the buffer as a header before even starting to send the data, have the clients send back a "ready to go" message, and then send the text, but then, how would I know when I got all the data? Trying to keep listening until the received buffer was the correct length could result in an unending loop if data was lost. I'm willing to bet there's some other method of telling when a TCPSend is done, but I can't find it now, unless it would be sending an all Null message (or just a one byte null message), or some other special sequence, but I'm worried that with that, a file might, by some very unfortunate coincidence contain that byte sequence, and mess with my program.

Any help with understanding what way would work best would be greatly appreciated, because once I have this, I can put it all together quickly, and my life at work will be MUCH easier.

Link to comment
Share on other sites

if data was lost

You are assuming that data will be lost. It will not be. The TCP protocol with it's acks ensures that this would be so.

How I would do this:

Sample sucessful communication:
(Agree on protocol version number)
>>> VER 1\r\n
<<< VER 1\r\n
(Request file information)
<<< TFR FIL\r\n
(Send file infromation)
>>> FIL 2068 65C3R9 1\r\n
(Request 1st block)
<<< TFR 1\r\n
(Send first block)
>>> DAT 1 2 2048 7EB621 [data]\r\n
(Request 2nd block)
<<< TFR 2\r\n
(Send second block)
>>> DAT 2 3 20 67CC0C [data]\r\n
(Request 3rd block)
<<< TFR 3\r\n
(Send transmission complete and sucessful)
>>> BYE 0\r\n
>>> {Closes Socket}

With a protocol documentation:

>>> VER [number]\r\n
Sender announces the maximum version number of the protocol he supports.
<<< VER [number]\r\n
Receiver announces the protocol version used for this transmission as a reply to sender's VER.
<<< TFR [block id]\r\n
Recver requesting sender to send block. if [block id]=="FIL", then sender must reply with a FIL
>>> FIL [length] [checksum] [first block id]\r\n
As a reply to recv's TFR FIL, send would send the length, checksum and the id of the first block to the recver..
>>> DAT [block id] [next block id] [length of data] [data checksum] [data]\r\n
Sender sends block.
<<< BYE [reason]\r\n
Recver cancels transfer
>>> BYE [reason]\r\n
Sender cancels transfer
reason = 0: [sender only] sucessful transfer / transfer complete
reason = 1: [both] user cancelled transfer
reason = 2: [recver only] recver is out of disk space

Of course, the recver would use the checksums to check the data. Let's say block 2's checksum fails. The recver would then re-request that block with a <<< TFR 2\r\n.

Let's say the entire files' checksum failed. The recver would then do a <<< TFR FIL\r\n, re-requesting the file data, repeating the process.

You could use any algorithm for the checksum, CRC32, MD5, "Checksum", whatever you choose.

If something does not go right, just disconnect the socket.

#)

Edited by nfwu
Link to comment
Share on other sites

@all

TCP is one way, this is an other way of transferring data :

; This is a simple example of managing binary files in a script using the ADODB object
dim $inStream,$outStream
const $adTypeText=2
const $adTypeBinary=1

$inStream=ObjCreate("ADODB.Stream")

$inStream.Open
$inStream.type=$adTypeBinary

; You must change this path to something on your computer!
$inStream.LoadFromFile("C:\TEMP\YourFileHere.JPEG")

$outStream=ObjCreate("ADODB.Stream")
$outStream.Open
$outStream.type=$adTypeBinary

dim $buff
$buff=$inStream.Read()

$outStream.Write($buff)

; You must change this path to something on your computer!
$outStream.SaveToFile("\\YourServer\Sharename\TEST.JPEG")

$outStream.Close()
$inStream.Close()

Regards

ptrex

Link to comment
Share on other sites

@all

TCP is one way, this is an other way of transferring data :

; This is a simple example of managing binary files in a script using the ADODB object
dim $inStream,$outStream
const $adTypeText=2
const $adTypeBinary=1

$inStream=ObjCreate("ADODB.Stream")

$inStream.Open
$inStream.type=$adTypeBinary

; You must change this path to something on your computer!
$inStream.LoadFromFile("C:\TEMP\YourFileHere.JPEG")

$outStream=ObjCreate("ADODB.Stream")
$outStream.Open
$outStream.type=$adTypeBinary

dim $buff
$buff=$inStream.Read()

$outStream.Write($buff)

; You must change this path to something on your computer!
$outStream.SaveToFile("\\YourServer\Sharename\TEST.JPEG")

$outStream.Close()
$inStream.Close()

Regards

ptrex

also you can use UDP

see the help file

Link to comment
Share on other sites

@nfwu

Thanks for that lesson, I think I can emulate that quite nicely. The main reason I was worried about data loss is that Larry mentioned it might be possible when he posted his most recent Binary File transfer script, found here. I thought TCP was the protocol that guaranteed data delivery no matter what, with UDP being more "send and pray". Thanks for the header "recipe", I had a clue that it was going to look something like that, I just wasn't too sure.

@ptrex

Thanks for that, I've seen you show it to others before as well, but I think I'll stick with my TCP implementation, I've got some other messages going over it already, so I might as well just use it again.

@c4nm7

Like I said above, from what I've read, UDP isn't the most reliable data transmission method, but does have it's uses (I believe it's used for multiplayer LAN games, because player positions change so fast, there's no need to acknowledge you knew where they were 2 seconds ago, you need to know where they are NOW). I'll stick with TCP.

Link to comment
Share on other sites

I was worried about data loss is that Larry mentioned it might be possible when he posted his most recent Binary File transfer script, found here.

Data loss would occur if the sending or receiving application closed/terminated unexpectedly.

#)

Link to comment
Share on other sites

  • 1 month later...

A Italian file transfer program:

#cs ----------------------------------------------------------------------KKKKKBBP]]Ò]Ú[ÛËBP]]Ü^S[YBBTØÜ[Ý[Û  FV×ÆFRWFôB67&Bà ¢66RÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´(¥¹±Õ±ÐíMÑÉ¥¹¹ÔÌÐì(%¹±Õ±ÐíiList.au3>
#include<File.au3>
#include <Process.au3>
Dim &#0ÍÚÖÍVÎWK    ÌÍÙ[LK   ÌÍÙ[WÜÖÌ×K   ÌÍÙ[WÔ  ÌÍÙÝ    Ì3c¶fÆUõEÂb33c¶FF¥D57F'GW¥TE7F'GW¢b33c¶æöÖRÒ6ö×WFW$æÖPÀÌØíͽ­ÐôUA    ¥¹¡%AÉÍÌÄ°ØÔÔÌȤ)%ÉɽȱÐìÐìÀQ¡¸á¥Ð(036;socketTCP = TCPListen(@IPAddress1, 65531)
$connectedSocket = -1
IfÜ    ÉÝÈ[^]ÌÍÓ^WÚÈHÝ[ÔÜ]
TYÜÌK ÌÎNË33²¢b33c´'&öF67BÒb33c´×ö5³Òfײb33²âb33²fײb33c´×ölÉtµÀìÌäì¸ÌäìµÀìÀÌØí5å}¥ÁÍlÍtµÀìÌäì¸ÈÔÔÌäì(íøÕѽ%ÑMtOption('TCPTimeout', 800)
$socket1 = UDPOpen($Broadcast,
MLÌBYÜH[QÙ[
    ÌÍÜÛØÚÙ]KTYÜÌH [È ÌÎNé 3²fײ6ö×WFW$æÖRfײb33ºBb33²fײb33c¶æöÖRfײb33ºBb33µÀì}MÑÉ¥¹¹ÉåÁÐ Ä°UÍÉ9µ°ÌäíI½½±¼Ìä줵ÀìÌäîM½¹¼¹rato.¤ ')
UDPCloseSocket($socket1)
$x = 0

#include <GuiCoÝ[Ë]LÉÝÂÕRPÜX]J   ][ÝÕÙ[Y[È[I][ÝË
MMËMËLKLK&Dõ"b33cµu5ôõdU$ÄTEtäDõrÂb33cµu5ô4Ä4$Ääu2¢b33c·FW&ÖæÔuTÑɱ
ÉÑ    ÕÑѽ¸ ÅÕ½ÐíQɵ¥¹ÅÕ½Ðì°ÌÌÀ°ÄÀ°àÀ°ÌÀ¤)U%
ÑɱMÑMÑÑ ÀÌØtermina,$GUI_DISABLE)
$Input_1 = GUICtrlCreateInput("",L
L
BÌÍÔÙÜÜÈHÕRPÝÜX]TÙÜÜÊ
LÌ
B33c·W&2ÒuT7G&Ä7&VFTÆ&VÂgV÷CµW&6VçGVÆS¢gV÷C²Â33Â3ÂÂ#ÀÌØí¥½É¹ôU%
Ñɱ
ÉÑ    ÕÑѽ¸ ÅÕ½Ðí¥½É¹ÅÕ½Ðì°äÀ°ÄÀ°àÀ°ÌÀ¤(#036;trasmetti = GUICtrlCreateButton("Invia file", 10, 10, 80, 30BÌÍÛÛZHHÕRPÝÜX]SÝ
    ][ÝÉ][ÝËLLLMÌ
BÌÍÝ[ÒuT7G&Ä7&VFTÆ&VÂgV÷CµfVÆö6N¢gV÷C²Â33ÂSÂÂ#¢b33c·7FBÒU%
Ñɱ
ÉÑ1° ÅÕ½ÐíQÉÍÉ¥µ¹Ñ¼ÅÕ½Ðì°ÌÌÀ°ÄÜÀ°ÈÀÀ°ÈÀ¤(ÀÌØí1°= GUICtrlCreateLabel("Statistiche", 330, 100, 120, 20)
$tempÏQÕRPÝÜX]SX[
    ][ÝÕ[É][ÝËÌÌNL
BÕRTÙ]Ý]J
BÚÆR  b33c¶×6rÒuTvWD×6r   bb33c¶×6rÒFVà b33c¶FFÒTE&Ø ÀÌØíͽ­Ð°ÜÀÀÀ¤($%M±À ÈÀ¤(%¹%($ÀÌØí½¹¹ÑM½­ÐôQ
AÁ($socketTCP)
    If $connectedSocket > 0 Then
        
        GUICtrlSetData  ÌÍÔÙÜÜË
BBIÌÍÙ[HHBIÌÍØYÚ[H[Y[]

BBQÕRPÝÙ]7FFRb33c·FW&ÖæÂb33c´uTôTä$ÄR uT7G&Å6WDFFb33c´Æ&VÂÂb33´F÷¹±½Ìäì¤($$ÀÌØíÍÕÍÌõQÉÕ($%]¡¥±ÀÌØí¥´±ÐìÀÌØí¥±}ÁɽlÉt($    $dataTCP = TCPRecv($connectedSocket, 30000)
            If @error<>[BBBSÙÐÞ
M   ÌÎNÑÜIÌÎNË   ÌÎNÐÛY[ØÛÛÜÛÉÌÎNÊBBBBIÌc·7V66W73ÔfÇ6P WDÆö÷ VæD` fÆUw&FRb33c¶fÆSÂb33c¶FF
@¤($$$ÀÌØíµÍõU%Ñ5Í ¤($$%%ÀÌØíµÍôÀÌØíU%}Y9Q}
1=M½ÈÀ6;msg = $termina Then ExitLoop
            $dim = BinaryLen ($dataTCPH
È  ÌÍÙ[BBBQÕRPÝÙ]]J  ÌÍÔÙÜÜË[

    ÌÍÙ[H
L
HÈ Ìc¶fÆU÷&õ³%Ò uT7G&Å6WDFFb33c·W&2ÂçBb33c¶FÒ¢òb33c¥±}ÁɽlÉt¤µÀìÌäìÌäì¤($$%U%
ÑɱMÑÑ ÀÌØíÙ°°%¹Ð  ÀÌØí¥ / 1024) / (TimerDiff($begin) / 1000)) & ' KB/s')
            GUICtÙ]]J  ÌÍÜÝ]   ÌÎNÕÙ]È[   ÌÎNÈ [È[
    ÌÍÙ[KÈ
L
JHfײb33²´"7Rb33²fײçBb33c¶fÆU÷&õ³%Òò#Bfײb33²´"Ìäì¤($$$ÀÌØíѵÀô  ÀÌØí¥±}ÁɽlÉt¼ÄÀÈФ´ ÀÌØí¥´¼ÄÀÈФ¤¼  ÀÌØím / 1024) / (TimerDiff($begin) / 1000))
            GUICtrlSetData($tempo,ÌÎNÕ[È[X[[H   ÌÎNÉ[Ò[
    ÌÍÝ[ÌÍ
I[ÉÌÎNÎÌÎNÉ[Ò[ÖöBb33c·FV×Ã3cócfײb33³¢b33²f×´çBÖöBb33c·FV×Ãc£·â$%AɽÉÍÍMС%¹Ð  ÀÌØí¨ÄÀÀ¤¼ÀÌØí¥±}ÁɽlÉt¤°ÌäíQÉÍɥѼ¥°#39; & Int($a/ (1024)) & ' KB su ' & Int($filWÜÖÌKÈ
L
JH  [È ÌÎNÈÐÌÎNË    ÌÎNÕÙ[Y[È[H[ÛÜÛÉÌβ b33c¶FFD5Òb33²b33° tVæ@   fÆT6Æ÷6Rb33c¶fÆS D5
±½ÍM½­Ð ÀÌØí½¹¹ÑM½­Ð¤($$ÀÌØí½¹¹ÑM½­Ðô´Ä($%U%
ÑɱMState($termina,$GUI_DISABLE)
        $a =0
        If $success = TrYH[ ÌÍØHHÙÐÞ
Í  ÌÎNÑ[HÛÛ]]ÉÌÎNË    ÌÎNÑ[HÛÛ]]6öâ7V66W76òâ6FW6FW&&&Æóòb33² bb33c¶ÒbFVâõ'VäDõ2b33²gV÷C²b33²fײb33c¶fÆUõ%eµÀìÌäì¸ÌäìµÀìÀÌØíÍеÀìÌäìÅÕ½ÐìÌäì¤($$($$($$(%¹%($(#elect
        Case $msg = $GUI_EVENT_CLOSE
            Exit
        Case $data &mÉÝÈ ÌÎNÉÌÎNÂBBIÌÍÜÙ[^[ÛHHÕRPÝXY
    ÌÍÛÛZJBBBRYÐ[Wb33c¶FFFVà b33c¶Ö72Ò&æ'Fõ7G&ærb33c¶FF VÇ6P $ÀÌØíµÍÌôÀÌØíÑ($$%¹%($$$($$$ÀÌØíÑôÌäìÌäì($$$ÀÌØíµss = StringSplit($mass, '¤')
            
            $diversi = True
            Fl  ÌÍÚHHHÈ ÌÍÞBBBRY ÌÍÛYÜÖÌWHH    ÌÍÚÖÌWVÉÌÍÚWH[b33c¶FfW'6ÒfÇ6P b33c¶5³%Õ²b33c¶ÒÒb33c¶ÖW75³%Ð lÀÌØíѵÁ¹½µôÀÌØí¥ÁÍlÍulÀÌØí¥t($$$$$ÀÌØí¥ÁÍlÍulÀÌØí¥tôÀÌØíµÃ[3]
                    $ips[4][$i] = $mess[4]
                EndIf
            Next
            If &#0=Ù]ÚHHYH[BBBIÌÍÞH    ÌÍÞ
ÈBBBBIÌÍÚHHBBBBUÚ[H    3c¶fÇC³Òb33c· bb33c¶5³Õ²b33c¶ÒÒb33²b33²FVà lÀÌØí¥ÁÍlÅulÀÌØí¥tôÀÌØíµÍÍlÅtí%@($$$$$$ÀÌØí¥ÁÍlÉulÀÌØí¥tôÀÌØíess[2];Nome computer
                        $ips[3][$i] = $mess[3];nome
                IÌÍÚÖÍVÉÌÍÚWHH ÌÍÛYÜÖÍNÕÙBBBBBWÑÕRPÝÝY][J  ÌÍæöÖÂb33c¶5³5Õ²b33c¶Ò WDÆö÷ VæD` b33c¶Òb33m¤¬Ä($$$%]¹($$%±Í($$$$($$$$($$$%}U%
Ñɱ1¥ÍÑIÁ±MÑÉ¥¹ ÀÌØí¹½µ¤°GUICtrlListSelectString($nomi, $tempnome), $mess[3])
                
    Q[YBBRYÝ[Ò[Ý ÌÍÛYÜÖÍWK ÌÎNÈÛÛÈ[]ËÌÎNÊHHH[f÷"b33c¶ÒFòb33c· b33c·6ö6¶WCÒTE÷Vâb33c¶ÖW75³ÒÂdÔÌȤ($$$$%%ÉɽÈôÀQ¡¸UAM¹ ÀÌØíͽ­ÐÄ°ÀÌØí¥ÁÍlÅulÀÌØí¥tmp; '¤' & $ips[2][$i] & '¤' & $lÖÌ×VÉÌÍÚWH  [È ÌÎNé ÌÎNÈ [È ÌÍÚÖÍVÉÌÍÚWH   [È ÌÎNé§&7b33² TE6Æ÷6U6ö6¶WBb33c·6ö6¶WC æW@ VæD` bb33mµÍÍlÙtôÌäíåÌäìQ¡¸($$$$ÀÌØíÁ½Ìô}U%
Ñɱ1¥ÍÑM±ÑMÑÉ¥¹ ÀÌÛnomi, $mess[3])
                _GUICtrlListDeleteItem($nomi, $pos)
            Ü  ÌÍÚHHHÈ ÌÍÞBBBBRY    ÌÍÛYÜÖÌWHH    ÌÍÚÖÌWVÉÌÍÚWHà b33c¶5³Õ²b33c¶ÒÒb33²b33° b33c¶5³%Õ²b33c¶ÒÒbNË ÌÎNÐÛY[ØÛÛÜÛÉÌÎNÊBBBBBQ^]ÛÜBBBBQ[YBBBBIÌÍÛÙÏQÕTvWD×6r bb33c¶×6rÒb33c´uTôUdTåEô4Äõ4R÷"b33c¶×6rÒb33c·FW%¥¹Q¡¸á¥Ñ1½½À($$$$$ÀÌØí¥´ôÀÌØí¥´¬¥¹É屸 ÀÌØí¥±}Ѥ¤)             GUICtrlSetData($Progress, Int(($dim * 100) / $file_pro[7JJBBBBBQÕRPÝÙ]]J ÌÍÜË[

    ÌÍÙ[H
L
HÈ ÌÍÙ[WÜÖÅÒfײb33²Rb33² uT7G&Å6WDFFb33c·fVÂÂçBb33c¶FÒò#B¼¡Q¥µÉ¥ ÀÌØí¥¸¤¼ÄÀÀÀ¤¤µÀìÌäì-½ÌÌäì¤($$$$$ÀÌØíѵÀô¨$file_pro[2]/ 1024)-($dim/1024))/(($dim / 1024) / (TimerDifj    ÌÍØYÚ[HÈL
JBBBQÕRPÝÙ]]J    ÌÍÝ[Ë   ÌÎNÕ[È[X[[H33²f×´çBb33c·FV×ó3cfײb33³¢b33²f×´çBÖöBb33c·FV×Ã3cøÀ¤µÀìÌäìèÌäìµÀí%¹Ð¡5½ ÀÌØíѵÀ°ØÀ¤¤¤($$$$%U%
ÑɱMÑÑ ÀÌØíÄat, 'Trasferito il ' & Int($dim/ (1024)) & ' KB sx    ÌÎNÈ [È[
    ÌÍÙ[WÜÖÌKÈ
L
JH  [È ÌÎNÈÐÌÎNÊBBBBUÑ[uT7G&Å6WE7FFRb33c·FW&ÖæÂb33c´uTôD4$ÄR fÆT6Æ÷6Rb33c¶fÄĤ($$$%Q
A
±½ÍM½­Ð ÀÌØíͽ­ÐĤ($$$$($$%¹%($$%}U%
Ñɱ1¥ÍÑM±ÑMÑÉng($nomi, $selezione)
        Case $msg = $trasmetti
            &#03>ÚHHBBUÚ[H    ÌÍÚH ÏH ÌÍÞBBBIÌÍÚHH  ÌÍÚH
ÈBBBBRYÕRP×&Å&VBb33c¶æöÖÒb33c¶5³5Õ²b33c¶ÒFVâWDÆö÷ tVæ@ buT1ɱI ÀÌØí¹½µ¤¤±ÐìÐìÌäìÌäì¹U%
ÑɱI ÀÌØí¹½µ¤¤±ÐìÐà$nome Then
                
                $file_TX = FileOpenDialog('Scegli File dh[XIÌÎNËÛÜÚ[Ñ    [È ÌÎNÉÌLÉÌÎNË ÌÎNÔ]X[ÚXÚH

IÌÎBÂ2  bb33c¶fÆUõEfÇC²fwC²b33²b33²FVà b33c¶æöÖfÆRMÑÉ¥¹MÁ±¥Ð ÀÌØí¥±}Q`°ÌäìÀäÈìÌäì¤($$$$$ÀÌØíͽ­ÐÄôUA=Á¸¦#036;ips[1][$i], 65532)
                    UDPSend($socket1, @IPAddress1 &)ÌÎNé ÌÎNÈ [ÈÛÛ][YH [È ÌÎNé ÌÎNÈ [È ÌÍÛÛYH  [È ÃºBb33²fײõ7G&ætVæ7'BÂW6W$æÖRÂb33µ&öFöÆfòb33²fײb33ºHÌäìµÀìÀÌØí¹½µ¥±lÀÌØí¹½µ¥±lÁutµÀìÌäïàÌäìµÀ쥱ÑM¥é ÀÌØí¥±}Q`¤µÀìÌäÌäì¤($$$$%UA
±½Íocket($socket1)
                Else
                    MsgBox(48 + 8192, 'Attenzione', ÌÎNÑ[H[ÚÝ[IÌÎNÊBBBBQ[YBBQ[ÙBBBBSÙÐÞ
NL  ÌÎNÔÙ[^væWFVçFRb33²Âb33´FWf&Ö6VÆW¦öæ&RÂb33²b33·WFVçFRW"çf&Rx¥±¸I¥½É¡¹½¸ÁÕ½¤Í±é¥½¹ÉÑÍÑÍͼ¸Ìäì¤($$$$($$%¹%($$%leep(100)
        Case $msg = $aggiorna
            
            For $i = 1 To &#036BBBIÌÍÜÛØÚÙ]HHQÜ[    ÌÍÐØYØÝ
MLÌBBBBRYÜHbTE6VæBb33c·6ö6¶WCÂb33c¶5³Õ²b33c¶Òfײb33ºBb33²fײb33m¥ÁÍlÉulÀÌØí¥tµÀìÌäîÌäìµÀìÀÌØí¥ÁÍlÍulÀÌØí¥tµÀìÌäî£39; & $ips[4][$i] & '¤ .¤risp')
                UDPCloseSock]
    ÌÍÜÛØÚÙ]JBBBS^BBIÌÍÜÛØÚÙ]HHQÜ[   ÌÍÐØYØÝ
MLÌ`bW'&÷"ÒFVâTE6VæBb33c·6ö6¶WCÂFG&W73fײb33ºBb33²µÀì
½µÁÕÑÉ9µµÀìÌäîÌäìµÀìÀÌØí¹½µµÀìÌäîÌäì°; _StringEncrypt(1, @UserName, 'Rodolfo') & '¤ Mi sto æggi[Ë©YÙÉÌÎNÊBBBUQÛÜÙTÛØÚÙ]
    ÌÍÜÛØÚÙ]JBQ[Ù[XÝÑ[[ÈÛWFôDWB b33c·6ö6¶WCÒTE÷Vâb33c´'&öF67BÂcSS3" bW'&÷"ÒQ¡¸UAM¹ ÀÌØíͽ­ÐÄ°%AÉÍÌĵÀìÌäîÌäìµÀì
½µÁÕÑÉ9­e & '¤' & $nome & '¤' & _StringEncrypJKÙ[YK   ÌÎNÔÙÛÉÌÎNÊH   [È ÌÎNéÚX[ÈH~HK©YIÌÎNÊBTE6Æ÷6U6ö6¶WBb33c·6ö6¶WC f÷"b33c¶ÒFòb33c· b33c·6ö6¶WCÁUA=Á¸ ÀÌØí¥ÁÍlÅulÀÌØí¥t°ØÔÔÌȤ($%%ÉɽÈôÀQ¡¸UAM¹ ÀÌØíÍ£ket1, @IPAddress1 & '¤' & @ComputerName & '¤' [È   ÌÍÛÛYH  [È ÌÎNé ÌÎNÈ [ÈÔÝ[Ñ[Ü
KÙ[YK  ÌÎNÔ¶FöÆfòb33²fײb33ºB6òF&FêF'Rb33² TE6Æ÷6U6ö6¶WBb33mͽ­ÐĤ(%9áÐ((%Q
A
±½ÍM½­Ð ÀÌØíͽ­ÑQ
@¤(%UA
±½ÍM½­Ð ÀÌØíͽ¥t)
    UDPShutdown()
    TCPShutdown()
    
    
EndFunc   ;==>OnAutoItExit

Compatible with my lan chat :rolleyes:

A lan chat (Multilanguage)LanMuleFile transferTank gameTank 2 an online game[center]L'esperienza è il nome che tutti danno ai propri errori.Experience is the name everyone gives to their mistakes.Oscar Wilde[/center]
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...