<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Visual Basic 6.0</title><link>https://www.dotnetzone.gr:443/cs/forums/25/ShowForum.aspx</link><description>Θέματα που αφορούν την VB6 και COM components</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/59343.aspx</link><pubDate>Sat, 03 Jul 2010 04:11:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59343</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/59343.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=59343</wfw:commentRss><description>&lt;P&gt;Δεν ξέρω πως πάει&amp;nbsp;η προσπάθεια για multithreading και sockets σε VB6, αλλά μόλις έγραψα ένα blog &lt;A href="http://www.dotnetzone.gr/cs/blogs/pkanavos/archive/2010/07/02/asyncrhonous-programming-in-net-made-simple-from-delegates-to-the-task-parallel-library.aspx"&gt;post&lt;/A&gt; για τους διάφορους τρόπους με τους οποίους γίνεται το asynchronous network programming στο .NET και είπα να ρίξω κι εδώ τον πιο σύντομο τρόπο μέχρι στιγμής, χρησιμοποιώντας τα &lt;A href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Extensions&lt;/A&gt;. Το παράδειγμα χρησιμοποιεί pipes αλλά στο post έχω και παράδειγμα με sockets.&amp;nbsp;Σε κανένα σημείο δεν χρειάζεται να χειριστώ εγώ threads ή synchronization, ενώ ο κώδικας μοιάζει σχεδόν με απλό κώδικα&amp;nbsp;:&lt;/P&gt;&lt;PRE style="FONT-FAMILY:consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;public&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;class&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;ReactivePipes&lt;/SPAN&gt;:&lt;SPAN style="COLOR:#2b91af;"&gt;IAsyncBase&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;protected&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;NamedPipeServerStream&lt;/SPAN&gt;&amp;nbsp;serverPipe&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;NamedPipeServerStream&lt;/SPAN&gt;(&lt;SPAN style="COLOR:#a31515;"&gt;"MyName"&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;PipeDirection&lt;/SPAN&gt;.InOut,&amp;nbsp;100,&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;PipeTransmissionMode&lt;/SPAN&gt;.Message,&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;PipeOptions&lt;/SPAN&gt;.Asynchronous);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;protected&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;NamedPipeClientStream&lt;/SPAN&gt;&amp;nbsp;clientPipe&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;NamedPipeClientStream&lt;/SPAN&gt;(&lt;SPAN style="COLOR:#a31515;"&gt;"."&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN style="COLOR:#a31515;"&gt;"MyName"&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;PipeDirection&lt;/SPAN&gt;.InOut,&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;PipeOptions&lt;/SPAN&gt;.Asynchronous);&lt;BR&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;public&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;void&lt;/SPAN&gt;&amp;nbsp;StartServer()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;var&lt;/SPAN&gt;&amp;nbsp;connect&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;Observable&lt;/SPAN&gt;.FromAsyncPattern(serverPipe.BeginWaitForConnection,&amp;nbsp;serverPipe.EndWaitForConnection);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;var&lt;/SPAN&gt;&amp;nbsp;read=&lt;SPAN style="COLOR:#2b91af;"&gt;Observable&lt;/SPAN&gt;.FromAsyncPattern&amp;lt;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[],&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;,&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;,&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;&amp;gt;(serverPipe.BeginRead,serverPipe.EndRead);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;var&lt;/SPAN&gt;&amp;nbsp;write=&lt;SPAN style="COLOR:#2b91af;"&gt;Observable&lt;/SPAN&gt;.FromAsyncPattern&amp;lt;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[],&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;,&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;&amp;gt;(serverPipe.BeginWrite,serverPipe.EndWrite);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connect().Subscribe(u&amp;nbsp;=&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[]&amp;nbsp;msg&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[20];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;read(msg,&amp;nbsp;0,&amp;nbsp;msg.Length).Subscribe(i&amp;nbsp;=&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;var&lt;/SPAN&gt;&amp;nbsp;input&amp;nbsp;=&lt;SPAN style="COLOR:#2b91af;"&gt;Encoding&lt;/SPAN&gt;.UTF8.GetString(msg,&amp;nbsp;0,i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;string&lt;/SPAN&gt;&amp;nbsp;message&amp;nbsp;=&lt;SPAN style="COLOR:#2b91af;"&gt;String&lt;/SPAN&gt;.Format(&lt;SPAN style="COLOR:#a31515;"&gt;"You&amp;nbsp;sent&amp;nbsp;{0}"&lt;/SPAN&gt;,input);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[]&amp;nbsp;buffer&amp;nbsp;=&lt;SPAN style="COLOR:#2b91af;"&gt;Encoding&lt;/SPAN&gt;.UTF8.GetBytes(message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write(buffer,&amp;nbsp;0,&amp;nbsp;buffer.Length);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt; &lt;BR&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;public&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;void&lt;/SPAN&gt;&amp;nbsp;StartClient()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;var&lt;/SPAN&gt;&amp;nbsp;read&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;Observable&lt;/SPAN&gt;.FromAsyncPattern&amp;lt;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[],&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;&amp;gt;(clientPipe.BeginRead,&amp;nbsp;serverPipe.EndRead);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;var&lt;/SPAN&gt;&amp;nbsp;write&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;Observable&lt;/SPAN&gt;.FromAsyncPattern&amp;lt;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[],&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt;&amp;gt;(clientPipe.BeginWrite,&amp;nbsp;serverPipe.EndWrite);&lt;BR&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clientPipe.Connect();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;var&lt;/SPAN&gt;&amp;nbsp;output&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;Encoding&lt;/SPAN&gt;.UTF8.GetBytes(&lt;SPAN style="COLOR:#a31515;"&gt;"5"&lt;/SPAN&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write(output,&amp;nbsp;0,&amp;nbsp;output.Length).Subscribe(u&amp;nbsp;=&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[]&amp;nbsp;bytes&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;byte&lt;/SPAN&gt;[20];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;read(bytes,&amp;nbsp;0,&amp;nbsp;bytes.Length).Subscribe(i&amp;nbsp;=&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:blue;"&gt;string&lt;/SPAN&gt;&amp;nbsp;message&amp;nbsp;=&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;Encoding&lt;/SPAN&gt;.UTF8.GetString(bytes,&amp;nbsp;0,&amp;nbsp;i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR:#2b91af;"&gt;Console&lt;/SPAN&gt;.WriteLine(message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/58166.aspx</link><pubDate>Tue, 20 Apr 2010 06:39:26 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58166</guid><dc:creator>ntaryl</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/58166.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=58166</wfw:commentRss><description>&lt;BR&gt;&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;ntaryl:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;P&gt;Καλησπερα  παιδια   &lt;/P&gt;&lt;P&gt;Ειμαι  παλι εδω  με τις σκεψεις  μου  και τις  αποριες  μου   &lt;/P&gt;&lt;P&gt;Πειραματιστηκα αρκετα  με το  async   και τελικα  καταφερα να  δημιουργησω ενα  project  στο  οποιο χρησιμοποιω Socket  api (vbip) .Καθε νεο  Socket   που  δημιουργειται   λειτουργει σε  νεο Thread   .Δηλαδη  οταν κανει listening(Thread  1 ),Connect (thread 2 ) κτλπ&lt;/P&gt;&lt;P&gt;Αργοτερα που  θα βρισκομαι σπιτι θα  ποσταρω  μερικα  screenshots απο  το  παραδειγμα  .&lt;/P&gt;&lt;P&gt;καλο απογευμα   &lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;P&gt;Υ.γ   Εχει  πολυ  διαβασμα  ακομα  .οταν τελειωσει με το καλο θα ποσταρω  ενα  μικρο παραδειγματακι   &lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;</description></item><item><title>Απ: Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/58156.aspx</link><pubDate>Mon, 19 Apr 2010 23:50:46 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58156</guid><dc:creator>ntaryl</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/58156.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=58156</wfw:commentRss><description>&lt;P&gt;Καλησπερα  παιδια   &lt;/P&gt;&lt;P&gt;Ειμαι  παλι εδω  με τις σκεψεις  μου  και τις  αποριες  μου   &lt;/P&gt;&lt;P&gt;Πειραματιστηκα αρκετα  με το  async   και τελικα  καταφερα να  δημιουργησω ενα  project  στο  οποιο χρησιμοποιω Socket  api (vbip) .Καθε νεο  Socket   που  δημιουργειται   λειτουργει σε  νεο Thread   .Δηλαδη  οταν κανει listening(Thread  1 ),Connect (thread 2 ) κτλπ&lt;/P&gt;&lt;P&gt;Αργοτερα που  θα βρισκομαι σπιτι θα  ποσταρω  μερικα  screenshots απο  το  παραδειγμα  .&lt;/P&gt;&lt;P&gt;καλο απογευμα   &lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;P&gt;Υ.γ   Εχει  πολυ  διαβασμα  ακομα  .οταν τελειωσει με το καλο θα ποσταρω  ενα  μικρο παραδειγματακι   &lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Απ: Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57946.aspx</link><pubDate>Tue, 06 Apr 2010 05:25:05 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57946</guid><dc:creator>vaggelis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57946.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=57946</wfw:commentRss><description>&lt;P&gt;Για να απαντησω συγκεκριμενα στην ερωτηση σου, ασχετα με το technology που χρησιμοποιεις. To Socket Multithreading συνηθως δουλευει με το εξης σκεφτικο:&lt;/P&gt;
&lt;P&gt;1. Το Main Thread (η το κυριως thread) "ακουει" στο port που θελεις. Το function που ακουει στο port mporei ειναι&amp;nbsp; non blocking ή blocking Wisock call kai εξαρταται απο εαν το προγραμμα σου κανει τιποτα αλλο, εκτος απο το να περιμενει συνδεση. Υπαρχουν τα σχετικα function calls για αυτο, μην γραψεις κανενα δικο σου "while true loop" για &lt;U&gt;blocing&lt;/U&gt; calls γιατι θα στειλεις το CPU στα ουρανια. Τα winsock "listen" function calls, σιγουρεουν οτι το προγραμμα σου δεν σπαταλαει CPU ενω περιμενει τη συνδεση (ειναι event driven). Μπορεις δηλαδη να εχεις κυριως while loop, αλλα σιγουρεψου οτι το condition ειναι κατι σαν "w.listen == true" (η οποιο function to library soy dinei) , ή αμα το προγραμμα σου κανει και αλλα, τοτε εχεις γραψει ενα event driven function (w.onListen = foo()...) &lt;/P&gt;
&lt;P&gt;2. Οταν υπαρξει συνδεση, τοτε το control γυρναει στην επομενη γραμμη του "listen".&amp;nbsp;Εκει&amp;nbsp;αρχιζεις καινουργιο &amp;nbsp;thread και περνας σαν parameter την δυνδεση (connection object), η stream,&amp;nbsp;η τι αλλο&amp;nbsp;που εχεις. Σου προτεινω να μην εχεις κανενα κωδικο εκει (validation, ktl). Βασικα καινουργιο thread σημαινει οτι εχεις ενα static function (συνηθως) με parameters αυτα που θελεις και οπου σιγουρευεις οτι καθε exception γινεται handled εκει μεσα, ειδικα αμα το τρεχεις με σε web server η αλλα "apartment threaded environments". Οταν το thread call γινει fired τοτε συνεχιζει ο κωδικος στο 1. (ξαναρχιζει το while loop,&amp;nbsp; ή προχωρα ο κωδικος και κανει αλλα που θες) και ταυτοχρονα τρεχει και ο κωδικος στο 2. &lt;/P&gt;
&lt;P&gt;Τωρα εαν εχεις απορια πως μπορει&amp;nbsp;ο κωδικος στο 1 να τρεχει και να ακουει αφου κανεις πραγματα με τη συνδεση στο 2, η απαντηση ειναι οτι internally το Winsock call που ακουει στο port poυ θελεις εχει κανει re-assign το port σε αλλο dynamic port "behind the scenes" οποτε ο κωδικος στο 2. δουλευει με connection στο δυναμικο port, οποτε το κυριως port στο 1 ειναι ελευθερο παλι... &lt;/P&gt;
&lt;P&gt;Ελπιζω να σου εδωσα μια ιδεα τοθ τι γινεται. Τωρα συγκεκριμενα με 3rd party Active X δεν ξερω εαν αυτο που χρησιμοποιεις ειναι γραμμενο καλα. Θα σου προτεινα να σιγουρευτιες οτι το ActiveX αυτο να ειναι "Free Threaded". To COM&amp;nbsp;εχει&amp;nbsp;settings για&amp;nbsp;Single, Apartment &amp;nbsp;kai free Threaded οταν τρεχει τετοια libraries. Μπορεις να αλλαξεις εσυ τι settings, αλλα συνηθως αυτα τα settings μπορει να κανουν crash το library, εξαρταται πως ειναι γραμμενο...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57945.aspx</link><pubDate>Tue, 06 Apr 2010 04:53:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57945</guid><dc:creator>ntaryl</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57945.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=57945</wfw:commentRss><description>&lt;P&gt;Ευχαριστω φιλε  για  το ενδιαφερον   &lt;/P&gt;&lt;P&gt;Το  συγκεκριμενο activex   το εχω και  απλα  το δοκιμαζω   .Ολα  αυτα πολυ  σωστα  τα  λες αλλα οπως  ειπα  στην περιπτωση που  υπαρχει μεταφορα  δεδομενων  συνεχεια  αναγκαστικα πρεπει  για  κα8ε  ενεργο Client να  υπαρχει ενα  thread  ετσι  ωστε  να  υπαρχει  ταυτοχρονη  μεταφορα  &lt;/P&gt;&lt;P&gt;Θα δοκιμασω  και  θα  ποσταρω   νεωτερες πληροφοριες  &lt;/P&gt;&lt;P&gt;καλο  βραδυ  &lt;/P&gt;</description></item><item><title>Απ: Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57937.aspx</link><pubDate>Sun, 04 Apr 2010 09:09:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57937</guid><dc:creator>George J. Capnias</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57937.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=57937</wfw:commentRss><description>&lt;P&gt;Να υποθέσω ότι αναφέρεσαι σε αυτό το "&lt;A href="http://www.evansprogramming.com/async.asp"&gt;Async&lt;/A&gt;"; Δεν το έχω χρησιμοποιήσει για να έχω μια άποψη τι μπορεί να κάνει, αλλά προσωπική θέση δεν θα χρησιμοποιούσα ένα προϊόν που η εταιρεία που το έχει αναπτύξει έχει πλέον κλείσει.&lt;/P&gt;
&lt;P&gt;Δεν είναι ανάγκη, να&amp;nbsp;τελιώσει ο ένας client για να εξυπηρετήσεις τον επόμενο. Βασικά αν ο καθένας πρέπει να έχει την δική του απάντηση, μετά το accept του connection, θα πρέπει να εξασφαλήσεις ότι έχεις πάρει όλο το request, και μετά του δίνεις την απάντηση που περιμένει. Αν ο κώδικας δεν είναι "tight",&amp;nbsp;σε κάποια σημεία θα διακόπτεται η ροή του προγράμματος και θα σηκώνει καινούργιο connection, θα διαβάζει βάση, και θα απαντάει,&amp;nbsp;για διαφορετικό client κάθε φορά, οπότε θα έχεις multi-tasking, μέσα στα όρια&amp;nbsp;ισχύος του επεξεργαστή που θα το τρέχει. Ξαναλέω, &lt;U&gt;&lt;STRONG&gt;δεν πρέπει&lt;/STRONG&gt; ο κώδικας να είναι &lt;STRONG&gt;"tight"&lt;/STRONG&gt;&lt;/U&gt;,&amp;nbsp;και &lt;U&gt;η ροή &lt;STRONG&gt;πρέπει&lt;/STRONG&gt; να είναι &lt;STRONG&gt;event-driven&lt;/STRONG&gt;&lt;/U&gt;.&amp;nbsp;Αυτό που έχω κάνει εγώ είναι αρκετά εξειδικευμένο μιας και όλοι οι clients έπρεπε να παίρνουν τα ίδια δεδομένα.&lt;/P&gt;
&lt;P&gt;Με κώδικα παρόμοιο με τον παραπάνω, κατόρθωσα να εξυπηρετήσω 20-25 ταυτόχρονους clients, τρέχοντας σε ένα Windows NT v4.0 σύστημα. Η αλήθεια ήταν ότι 20-25 ήταν οι clients που ήταν στην ουρά για να εξυπηρετηθούν, ενώ πραγματικά εγώ είχα ένα, το πολύ&amp;nbsp;δύο connections ανοιχτά - ο χρόνος που χρειαζόταν η VB6 να ανεβάσει ένα winsock control στην μνήμη και να ανοίξει TCP/IP επικοινωνία, ήταν πολύ μεγαλύτερος από τον χρόνο που χρειαζόμουν εγώ για να διαβάσω μια βάση μέσα από ODBC και να απαντήσω με 1Kb-1,5Kb δεδομένων.&lt;/P&gt;
&lt;P&gt;Δύο - τρία χρόνια αργότερα όταν χρειάστηκε να κάνω παρόμοια δουλειά με περισσότερους ταυτόχρονους χρήστες, δεν το πάλεψα καθόλου, αλλά χρησιμοποίησα για την μία και μόνη φορά στην ζωή μου το &lt;A href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=c943c0dd-ceec-4088-9753-86f052ec8450"&gt;SOAP Toolkit&lt;/A&gt; της Microsoft. Όλο εκείνο το fine-tuning, που είχα κάνει για να ξεφορτώνονται όλα τα control και να μην έχω memory leaks, όλες εκείνες οι αμέτρητες ώρες που πέρασα επάνω από το working instance για να είμαι σίγουρος ότι δεν χάνει&amp;nbsp;δεδομένα και δεν φορτώνει στο 100% επεξεργαστή, απλώς δεν&amp;nbsp;χρειάζοντουσαν, αφού όλο το φορτίο της δουλειάς το πήρε ο IIS, που πραγματικά το αντέχει...&lt;/P&gt;
&lt;P&gt;Βέβαια, τότε είχα τις γκρίνιες που χρησιμοποιούσα τον IIS, και είχα φτιάξει ένα mini-web server σε VB6 για να μπορώ να τρέξω το server κομμάτι του SOAP, αλλά δεν το έβγαλα ποτέ στην παραγωγή. Ο IIS μπορεί να τρέξει επάνω και σε Windows XP ή όποιο άλλο client λειτουργικό, με τον περιορισμό των 10 ταυτόχρονων συνδέσεων, που αν θες να το περάσεις αυτό το όριο, ούτως ή άλλως, θα πρέπει να πας σε server λειτουργικό. Δεν το έχω αυτό το κομμάτι κώδικα πρόχειρο, αλλά και πάλι δεν νομίζω ότι αξίζει καν να ασχοληθείς αφού έχεις καλύτερη λύση και δωρεάν...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;George J.&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Απ: Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57935.aspx</link><pubDate>Sun, 04 Apr 2010 04:04:52 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57935</guid><dc:creator>ntaryl</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57935.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=57935</wfw:commentRss><description>&lt;P&gt;Καλησπερα φιλε μου&lt;/P&gt;
&lt;P&gt;Σου&amp;nbsp; ευχομαι Καλη Ανασταση&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Χpησιμοποιω το&amp;nbsp; Async Multithreading Activex&amp;nbsp; και&amp;nbsp; απ οτι&amp;nbsp; βλεπω&amp;nbsp; υποστηριζει&amp;nbsp; Multithreading&amp;nbsp; .Δοκιμασα&amp;nbsp; αρκετα&amp;nbsp; παραδειγματα για&amp;nbsp; Multithreading&amp;nbsp;ολα&amp;nbsp; σχεδον&amp;nbsp; κρασαρανε και το&amp;nbsp; πιο καλο απ ολα&amp;nbsp; ηταν αυτο&amp;nbsp; απο το thunderAsm.&lt;/P&gt;
&lt;P&gt;Τελικα κατεληξα στο&amp;nbsp; να&amp;nbsp; χρησιμοποιησω το παραπανω&amp;nbsp; activex&amp;nbsp; που αναφερω&amp;nbsp; .&lt;/P&gt;
&lt;P&gt;Το&amp;nbsp; παραδειγματακι σου&amp;nbsp; καλο και σε&amp;nbsp; ευχαριστω&amp;nbsp;&amp;nbsp; αλλα στο&amp;nbsp; συγκεκριμενο στελνεις&amp;nbsp;το&amp;nbsp; αρχειο σε&amp;nbsp; καθε πελατη.Τι&amp;nbsp; γινετε&amp;nbsp; στην περιπτωση που&amp;nbsp; στελνει αρκετα δεδομενα στον πελατη ?&amp;nbsp;&amp;nbsp;Σημαινει&amp;nbsp; οτι περιμενουμε να τελειωσει ο πρωτος&amp;nbsp; για να στειλουμε στον επομενο &lt;/P&gt;
&lt;P&gt;Δεν εχω&amp;nbsp; προβλημα&amp;nbsp; στο να δεχομαι η να χειριζομαι συνδεσεις&lt;/P&gt;
&lt;P&gt;Το&amp;nbsp; ολο&amp;nbsp; σκεφτικο μου ειναι το να&amp;nbsp; μπορω&amp;nbsp; να&amp;nbsp; χειριζομαι&amp;nbsp; συνδεσεις&amp;nbsp; την ιδια&amp;nbsp; στιγμη&amp;nbsp; και να&amp;nbsp; στελνω&amp;nbsp; δεδομενα&amp;nbsp; ταυτοχρονα&amp;nbsp; σε περισοτερο απο ενα πελατη&amp;nbsp; ..&lt;/P&gt;
&lt;P&gt;καλο&amp;nbsp; βραδυ&amp;nbsp; φιλε&amp;nbsp;&amp;nbsp; μου&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57933.aspx</link><pubDate>Sat, 03 Apr 2010 09:24:25 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57933</guid><dc:creator>George J. Capnias</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57933.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=57933</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;ntaryl:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;
&lt;P&gt;Καλησπερα&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Παλι θα μιλησουμε &amp;nbsp;για &amp;nbsp;Multithreading &amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ισως &amp;nbsp;πει καποιος &amp;nbsp;οτι δεν υποστηριζει &amp;nbsp;αλλα τελικα με χρηση καποιου &amp;nbsp;extra Activex &amp;nbsp;ειναι αρκετα ευκολο&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Αυτο που &amp;nbsp;θελω &amp;nbsp;να &amp;nbsp;μαθω &amp;nbsp;ειναι &amp;nbsp;την λογικη πισω απο &amp;nbsp;το socket &amp;nbsp;Multithreading &amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ανοιγουμε &amp;nbsp; νεο thread και για το &amp;nbsp;Socket &amp;nbsp;που κανει listening &amp;nbsp; ?&lt;/P&gt;
&lt;P&gt;Οταν δεχομαστε συνδεσεις σε &amp;nbsp;καθε &amp;nbsp;νεο πελατη ανοιγουμε &amp;nbsp;νεο thread ?&lt;/P&gt;
&lt;P&gt;Ανοιγουμε &amp;nbsp;νεο &amp;nbsp;και &amp;nbsp;οταν κανουμε &amp;nbsp;send Receive ?&lt;/P&gt;
&lt;P&gt;ευχαριστω πολυ &amp;nbsp;και καλο &amp;nbsp;βραδυ &amp;nbsp; &amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;Καλό είναι ότι έχεις εμμονές Μ. Παρασκευή βράδυ, το κακό είναι ότι τις έχεις με την VB6 - ότι και να κάνεις, ότι και να βρεις, να είναι γραμμένο σε οποιαδήποτε γλώσσα που υποστηρίζει COM, και το καλέσεις μέσα από VB6 θα έχεις 1 νήμα, άρα το πρόγραμμά σου θα εκτελεί κώδικα σε ένα σημείο κάθε φορά. Αν προσπαθήσεις να χακάρεις την VB6 για να μπορέσει να εκτελέσει παράλληλα threads, αυτό που καταφέρεις είναι να κρασάρεις το VB6 IDE και να μην μπορείς να κάνεις compile και debug.&lt;/P&gt;
&lt;P&gt;Οπότε αν η δημιουργία ενός thread είναι περιοριστικό για σένα, καλό θα ήταν να αρχίσεις να κοιτάς κάποια άλλη γλώσσα προγραμματισμού που θα δεν θα σε περιορίζει. Δεν έχει νόημα, να εύχεσαι να γίνει multithreading η VB6, κάτι που το έκαναν πριν από σένα εκατοντάδες χιλιάδες προγραμματιστών ανά τον κόσμο, και ποτέ δεν ικανοποιήθηκε η επιθυμία τους. Αν η VB6 είναι περιοριστικός παράγοντας για εσένα, θα πρέπει να γίνεις καλύτερος προγραμματιστής - καλύτεροι αλγόριθμοι, αποφυγή tight loops, χρήση event driven programming, είναι αυτά που θα σε βοηθήσουν.&lt;/P&gt;
&lt;P&gt;Αν δεχτείς ότι πρέπει να πάψεις να εύχεσαι multitasking σε VB6, και πιστέψεις ότι μπορείς να το καταφέρεις με τους περιορισμούς της VB6, είμαι σίγουρος ότι θα βρεις την λύση που χρειάζεσαι, όπως και εκατομμύρια προγραμματιστές VB6...&lt;/P&gt;
&lt;P&gt;Το παρακάτω είναι ο κώδικας που έγραψα για ένα προγραμματάκι που διαβάζει ένα text αρχείο από το δίσκο και το στέλνει γραμμή-γραμμή σε όσους clients είναι συνδεδεμένοι μαζί του, μέσα από WinSock. Αυτό που σε ενδιαφέρει είναι να δεις πως εγώ χειρίζομαι τα εισερχόμενα connections και πως τα δέχομαι.&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="BORDER-BOTTOM:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;BORDER-TOP:#e5e5e5 1px solid;BORDER-RIGHT:#e5e5e5 1px solid;" border=0 cellSpacing=0 cellPadding=0 width="100%"&gt;

&lt;TR style="LINE-HEIGHT:normal;VERTICAL-ALIGN:top;"&gt;
&lt;TD style="TEXT-ALIGN:right;WIDTH:40px;"&gt;&lt;PRE style="PADDING-BOTTOM:2px;MARGIN:0px;PADDING-LEFT:2px;PADDING-RIGHT:2px;FONT-FAMILY:courier new;COLOR:gray;FONT-SIZE:11px;BORDER-RIGHT:#e7e7e7 1px solid;PADDING-TOP:2px;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
 &lt;/PRE&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;PRE style="PADDING-BOTTOM:2px;MARGIN:0px;PADDING-LEFT:8px;PADDING-RIGHT:2px;PADDING-TOP:2px;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Option&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Explicit&lt;/SPAN&gt;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; fileObject &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; Scripting.FileSystemObject
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; winSocketCollection &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; Scripting.Dictionary
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; IsRunning &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Boolean&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Declare&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; Sleep &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Lib&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"kernel32"&lt;/SPAN&gt; (&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/SPAN&gt; dwMilliseconds &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;)

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; cmdSelectFile_Click()
    commonDialog.DialogTitle &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ÅðéëÝîôå Ýíá áñ÷åßï êåéìÝíïõ"&lt;/SPAN&gt;
    commonDialog.InitDir &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; App.Path
    commonDialog.Flags &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; cdlOFNFileMustExist
    commonDialog.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Filter&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Log Files (*.log)|*.log|Text Files (*.txt)|*.txt|All Files (*.*)|*.*"&lt;/SPAN&gt;
    commonDialog.FilterIndex &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0
    commonDialog.ShowOpen
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; commonDialog.FileTitle &amp;lt;&amp;gt; vbNullString &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
        txtFileName.Text &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; commonDialog.FileName
        
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
    
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; cmdStart_Click()
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; fileStream &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; Scripting.TextStream
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; sLines() &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/SPAN&gt;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; currentLine &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; currentWinsock &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; Variant

    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Not&lt;/SPAN&gt; fileObject.FileExists(txtFileName.Text) &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;MsgBox&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ÐñÝðåé íá åðéëÝîåôå Ýíá áñ÷åßï äåäïìÝíùí ðñþôá!"&lt;/SPAN&gt;, vbCritical &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Or&lt;/SPAN&gt; vbOKOnly, &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ÓöÜëìá"&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Exit&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;

    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Set&lt;/SPAN&gt; fileStream &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; fileObject.OpenTextFile(txtFileName.Text, ForReading, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;, TristateUseDefault)
    sLines &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Split&lt;/SPAN&gt;(fileStream.ReadAll, vbCrLf)
    fileStream.Close
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Set&lt;/SPAN&gt; fileStream &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Nothing&lt;/SPAN&gt;

    cmdStart.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    cmdStop.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;True&lt;/SPAN&gt;
    theTimer.Interval &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 1000
    theTimer.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;True&lt;/SPAN&gt;
    IsRunning &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;True&lt;/SPAN&gt;
    
    currentLine &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Do&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/SPAN&gt; IsRunning
        lblStatus.Caption &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; sLines(currentLine)
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Each&lt;/SPAN&gt; currentWinsock &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; winSocketCollection.Keys
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Call&lt;/SPAN&gt; winSock(winSocketCollection(currentWinsock)).SendData(sLines(currentLine) &amp;amp; vbCrLf)
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Call&lt;/SPAN&gt; Sleep(100)
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt;
        DoEvents
        currentLine &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;IIf&lt;/SPAN&gt;(currentLine &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/SPAN&gt; 1 &amp;lt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;UBound&lt;/SPAN&gt;(sLines), currentLine &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/SPAN&gt; 1, 0)
        txtStatus.Text &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(currentLine)
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Loop&lt;/SPAN&gt;
    
    theTimer.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    
    cmdStop.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    cmdStart.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;True&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; cmdStop_Click()
    IsRunning &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; Form_Initialize()
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Set&lt;/SPAN&gt; fileObject &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;New&lt;/SPAN&gt; Scripting.FileSystemObject
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Set&lt;/SPAN&gt; winSocketCollection &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;New&lt;/SPAN&gt; Scripting.Dictionary
    
    IsRunning &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    cmdStart.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;True&lt;/SPAN&gt;
    cmdStop.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    
    winSock(0).LocalPort &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 1001
    winSock(0).Listen
    
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; Form_Load()
    txtFileName.Text &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;GetSetting&lt;/SPAN&gt;(&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Me&lt;/SPAN&gt;.Name, &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Settings"&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"path"&lt;/SPAN&gt;, vbNullString)

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; Form_Unload(Cancel &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/SPAN&gt;)
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; currentWinsock &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; Variant

    IsRunning &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Each&lt;/SPAN&gt; currentWinsock &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;In&lt;/SPAN&gt; winSocketCollection.Keys
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Call&lt;/SPAN&gt; winSock(winSocketCollection(currentWinsock)).Close
        Unload winSock(winSocketCollection(currentWinsock))
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt;
    
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; txtFileName.Text &amp;lt;&amp;gt; vbNullString &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Call&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;SaveSetting&lt;/SPAN&gt;(&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Me&lt;/SPAN&gt;.Name, &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Settings"&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"path"&lt;/SPAN&gt;, txtFileName.Text)
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
    
    
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; winSock_Close(Index &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/SPAN&gt;)
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; iCounter &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;
    
    Debug.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"winSocket Close ("&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(Index) &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;")."&lt;/SPAN&gt;
    
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; iCounter &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;To&lt;/SPAN&gt; lstClients.ListCount &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;-&lt;/SPAN&gt; 1
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; lstClients.List(iCounter) &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; winSock(Index).RemoteHostIP &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;" - "&lt;/SPAN&gt; &amp;amp; winSock(Index).RemotePort &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
           lstClients.RemoveItem (iCounter)
           &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Exit&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; lstClients.ListCount &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
        IsRunning &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
        
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;'winSock(Index).Close&lt;/SPAN&gt;
    Unload winSock(Index)
    winSocketCollection.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Remove&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ctl:"&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(Index)

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; winSock_ConnectionRequest(Index &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/SPAN&gt; requestID &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;)
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; newIndex &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;

    newIndex &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; getNextAvailiableSocket
    Load winSock(newIndex)
    winSock(newIndex).LocalPort &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0
    winSock(newIndex).Accept requestID
    lstClients.AddItem winSock(newIndex).RemoteHostIP &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;" - "&lt;/SPAN&gt; &amp;amp; winSock(newIndex).RemotePort
    cmdStart.Enabled &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;True&lt;/SPAN&gt;
    
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Not&lt;/SPAN&gt; IsRunning &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;And&lt;/SPAN&gt; winSocketCollection.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Count&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 1 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
        cmdStart_Click
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
    
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt; winSock_Error(Index &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Number&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Description&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/SPAN&gt; Scode &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Source&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;HelpFile&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/SPAN&gt;, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;HelpContext&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;, CancelDisplay &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Boolean&lt;/SPAN&gt;)
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; iCounter &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;On&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Error&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Resume&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt;
    
    CancelDisplay &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;True&lt;/SPAN&gt;
    Debug.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"winSocket Error ("&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(Index) &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;") - ("&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Number&lt;/SPAN&gt;) &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;") "&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Description&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"."&lt;/SPAN&gt;
    
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; iCounter &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;To&lt;/SPAN&gt; lstClients.ListCount &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;-&lt;/SPAN&gt; 1
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; lstClients.List(iCounter) &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; winSock(Index).RemoteHostIP &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;" - "&lt;/SPAN&gt; &amp;amp; winSock(Index).RemotePort &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
           lstClients.RemoveItem (iCounter)
           &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Exit&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; lstClients.ListCount &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
        IsRunning &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
    
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;'winSock(Index).Close&lt;/SPAN&gt;
    Unload winSock(Index)
    winSocketCollection.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Remove&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ctl:"&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(Index)

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;On&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Error&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;GoTo&lt;/SPAN&gt; 0
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/SPAN&gt;

&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Function&lt;/SPAN&gt; getNextAvailiableSocket() &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/SPAN&gt; currentControl &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Long&lt;/SPAN&gt;

    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; winSocketCollection.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Count&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
        currentControl &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 1
        winSocketCollection.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ctl:"&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(currentControl), currentControl
        getNextAvailiableSocket &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; currentControl
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Else&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt; currentControl &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 1 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;To&lt;/SPAN&gt; winSocketCollection.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Count&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/SPAN&gt; 1
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Not&lt;/SPAN&gt; winSocketCollection.Exists(&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ctl:"&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(currentControl)) &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/SPAN&gt;
                winSocketCollection.&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ctl:"&lt;/SPAN&gt; &amp;amp; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CStr&lt;/SPAN&gt;(currentControl), currentControl
                getNextAvailiableSocket &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; currentControl
                &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Exit&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;For&lt;/SPAN&gt;
        
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Next&lt;/SPAN&gt;
    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/SPAN&gt;


&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Function&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;Το πιο έξυπνο "trick" που έχει το πρόγραμμα είναι πως αποθηκεύει τα καινούργια control στο winsock array που δημιουργεί για να δεχτεί τα νέα connections - βλ. function getNextAvailiableSocket().&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;George J.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Socket Multithreading και Functions</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57932.aspx</link><pubDate>Sat, 03 Apr 2010 05:12:39 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57932</guid><dc:creator>ntaryl</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57932.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=25&amp;PostID=57932</wfw:commentRss><description>&lt;P&gt;Καλησπερα &lt;/P&gt;&lt;P&gt;Παλι θα μιλησουμε  για  Multithreading  &lt;/P&gt;&lt;P&gt;Ισως  πει καποιος  οτι δεν υποστηριζει  αλλα τελικα με χρηση καποιου  extra Activex  ειναι αρκετα ευκολο &lt;/P&gt;&lt;P&gt;Αυτο που  θελω  να  μαθω  ειναι  την λογικη πισω απο  το socket  Multithreading  &lt;/P&gt;&lt;P&gt;Ανοιγουμε   νεο thread και για το  Socket  που κανει listening   ?&lt;/P&gt;&lt;P&gt;Οταν δεχομαστε συνδεσεις σε  καθε  νεο πελατη ανοιγουμε  νεο thread ?&lt;/P&gt;&lt;P&gt;Ανοιγουμε  νεο  και  οταν κανουμε  send Receive ?&lt;/P&gt;&lt;P&gt;ευχαριστω πολυ  και καλο  βραδυ    &lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;</description></item></channel></rss>