|
Îåêßíçóå áðü ôï ìÝëïò ntaryl. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 02-07-2010, 21:11. Υπάρχουν 8 απαντήσεις.
-
02-04-2010, 22:12
|
-
ntaryl
-
-

-
Μέλος από τις 02-05-2006
-
User Mode yet
-
Δημοσιεύσεις 149
-
-
|
Socket Multithreading και Functions
Καλησπερα Παλι θα μιλησουμε για Multithreading Ισως πει καποιος οτι δεν υποστηριζει αλλα τελικα με χρηση καποιου extra Activex ειναι αρκετα ευκολο Αυτο που θελω να μαθω ειναι την λογικη πισω απο το socket Multithreading Ανοιγουμε νεο thread και για το Socket που κανει listening ? Οταν δεχομαστε συνδεσεις σε καθε νεο πελατη ανοιγουμε νεο thread ? Ανοιγουμε νεο και οταν κανουμε send Receive ? ευχαριστω πολυ και καλο βραδυ
Rookie learn to fly U are my Inspiration... Who said Multithreading is impossible Try it First and after Deside if is Possible
|
|
-
03-04-2010, 02:24
|
|
Απ: Socket Multithreading και Functions
ntaryl:
Καλησπερα
Παλι θα μιλησουμε για Multithreading
Ισως πει καποιος οτι δεν υποστηριζει αλλα τελικα με χρηση καποιου extra Activex ειναι αρκετα ευκολο
Αυτο που θελω να μαθω ειναι την λογικη πισω απο το socket Multithreading
Ανοιγουμε νεο thread και για το Socket που κανει listening ?
Οταν δεχομαστε συνδεσεις σε καθε νεο πελατη ανοιγουμε νεο thread ?
Ανοιγουμε νεο και οταν κανουμε send Receive ?
ευχαριστω πολυ και καλο βραδυ
Καλό είναι ότι έχεις εμμονές Μ. Παρασκευή βράδυ, το κακό είναι ότι τις έχεις με την VB6 - ότι και να κάνεις, ότι και να βρεις, να είναι γραμμένο σε οποιαδήποτε γλώσσα που υποστηρίζει COM, και το καλέσεις μέσα από VB6 θα έχεις 1 νήμα, άρα το πρόγραμμά σου θα εκτελεί κώδικα σε ένα σημείο κάθε φορά. Αν προσπαθήσεις να χακάρεις την VB6 για να μπορέσει να εκτελέσει παράλληλα threads, αυτό που καταφέρεις είναι να κρασάρεις το VB6 IDE και να μην μπορείς να κάνεις compile και debug.
Οπότε αν η δημιουργία ενός thread είναι περιοριστικό για σένα, καλό θα ήταν να αρχίσεις να κοιτάς κάποια άλλη γλώσσα προγραμματισμού που θα δεν θα σε περιορίζει. Δεν έχει νόημα, να εύχεσαι να γίνει multithreading η VB6, κάτι που το έκαναν πριν από σένα εκατοντάδες χιλιάδες προγραμματιστών ανά τον κόσμο, και ποτέ δεν ικανοποιήθηκε η επιθυμία τους. Αν η VB6 είναι περιοριστικός παράγοντας για εσένα, θα πρέπει να γίνεις καλύτερος προγραμματιστής - καλύτεροι αλγόριθμοι, αποφυγή tight loops, χρήση event driven programming, είναι αυτά που θα σε βοηθήσουν.
Αν δεχτείς ότι πρέπει να πάψεις να εύχεσαι multitasking σε VB6, και πιστέψεις ότι μπορείς να το καταφέρεις με τους περιορισμούς της VB6, είμαι σίγουρος ότι θα βρεις την λύση που χρειάζεσαι, όπως και εκατομμύρια προγραμματιστές VB6...
Το παρακάτω είναι ο κώδικας που έγραψα για ένα προγραμματάκι που διαβάζει ένα text αρχείο από το δίσκο και το στέλνει γραμμή-γραμμή σε όσους clients είναι συνδεδεμένοι μαζί του, μέσα από WinSock. Αυτό που σε ενδιαφέρει είναι να δεις πως εγώ χειρίζομαι τα εισερχόμενα connections και πως τα δέχομαι.
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
|
Option Explicit
Private fileObject As Scripting.FileSystemObject
Private winSocketCollection As Scripting.Dictionary
Private IsRunning As Boolean
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub cmdSelectFile_Click()
commonDialog.DialogTitle = "ÅðéëÝîôå Ýíá áñ÷åßï êåéìÝíïõ"
commonDialog.InitDir = App.Path
commonDialog.Flags = cdlOFNFileMustExist
commonDialog.Filter = "Log Files (*.log)|*.log|Text Files (*.txt)|*.txt|All Files (*.*)|*.*"
commonDialog.FilterIndex = 0
commonDialog.ShowOpen
If commonDialog.FileTitle <> vbNullString Then
txtFileName.Text = commonDialog.FileName
End If
End Sub
Private Sub cmdStart_Click()
Dim fileStream As Scripting.TextStream
Dim sLines() As String
Dim currentLine As Long
Dim currentWinsock As Variant
If Not fileObject.FileExists(txtFileName.Text) Then
MsgBox "ÐñÝðåé íá åðéëÝîåôå Ýíá áñ÷åßï äåäïìÝíùí ðñþôá!", vbCritical Or vbOKOnly, "ÓöÜëìá"
Exit Sub
End If
Set fileStream = fileObject.OpenTextFile(txtFileName.Text, ForReading, False, TristateUseDefault)
sLines = Split(fileStream.ReadAll, vbCrLf)
fileStream.Close
Set fileStream = Nothing
cmdStart.Enabled = False
cmdStop.Enabled = True
theTimer.Interval = 1000
theTimer.Enabled = True
IsRunning = True
currentLine = 0
Do While IsRunning
lblStatus.Caption = sLines(currentLine)
For Each currentWinsock In winSocketCollection.Keys
Call winSock(winSocketCollection(currentWinsock)).SendData(sLines(currentLine) & vbCrLf)
Call Sleep(100)
Next
DoEvents
currentLine = IIf(currentLine + 1 < UBound(sLines), currentLine + 1, 0)
txtStatus.Text = CStr(currentLine)
Loop
theTimer.Enabled = False
cmdStop.Enabled = False
cmdStart.Enabled = True
End Sub
Private Sub cmdStop_Click()
IsRunning = False
End Sub
Private Sub Form_Initialize()
Set fileObject = New Scripting.FileSystemObject
Set winSocketCollection = New Scripting.Dictionary
IsRunning = False
cmdStart.Enabled = True
cmdStop.Enabled = False
winSock(0).LocalPort = 1001
winSock(0).Listen
End Sub
Private Sub Form_Load()
txtFileName.Text = GetSetting(Me.Name, "Settings", "path", vbNullString)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim currentWinsock As Variant
IsRunning = False
For Each currentWinsock In winSocketCollection.Keys
Call winSock(winSocketCollection(currentWinsock)).Close
Unload winSock(winSocketCollection(currentWinsock))
Next
If txtFileName.Text <> vbNullString Then
Call SaveSetting(Me.Name, "Settings", "path", txtFileName.Text)
End If
End Sub
Private Sub winSock_Close(Index As Integer)
Dim iCounter As Long
Debug.Print "winSocket Close (" & CStr(Index) & ")."
For iCounter = 0 To lstClients.ListCount - 1
If lstClients.List(iCounter) = winSock(Index).RemoteHostIP & " - " & winSock(Index).RemotePort Then
lstClients.RemoveItem (iCounter)
Exit For
End If
Next
If lstClients.ListCount = 0 Then
IsRunning = False
End If
'winSock(Index).Close
Unload winSock(Index)
winSocketCollection.Remove "ctl:" & CStr(Index)
End Sub
Private Sub winSock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim newIndex As Long
newIndex = getNextAvailiableSocket
Load winSock(newIndex)
winSock(newIndex).LocalPort = 0
winSock(newIndex).Accept requestID
lstClients.AddItem winSock(newIndex).RemoteHostIP & " - " & winSock(newIndex).RemotePort
cmdStart.Enabled = True
If Not IsRunning And winSocketCollection.Count = 1 Then
cmdStart_Click
End If
End Sub
Private Sub winSock_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Dim iCounter As Long
On Error Resume Next
CancelDisplay = True
Debug.Print "winSocket Error (" & CStr(Index) & ") - (" & CStr(Number) & ") " & Description & "."
For iCounter = 0 To lstClients.ListCount - 1
If lstClients.List(iCounter) = winSock(Index).RemoteHostIP & " - " & winSock(Index).RemotePort Then
lstClients.RemoveItem (iCounter)
Exit For
End If
Next
If lstClients.ListCount = 0 Then
IsRunning = False
End If
'winSock(Index).Close
Unload winSock(Index)
winSocketCollection.Remove "ctl:" & CStr(Index)
On Error GoTo 0
End Sub
Private Function getNextAvailiableSocket() As Long
Dim currentControl As Long
If winSocketCollection.Count = 0 Then
currentControl = 1
winSocketCollection.Add "ctl:" & CStr(currentControl), currentControl
getNextAvailiableSocket = currentControl
Else
For currentControl = 1 To winSocketCollection.Count + 1
If Not winSocketCollection.Exists("ctl:" & CStr(currentControl)) Then
winSocketCollection.Add "ctl:" & CStr(currentControl), currentControl
getNextAvailiableSocket = currentControl
Exit For
End If
Next
End If
End Function |
Το πιο έξυπνο "trick" που έχει το πρόγραμμα είναι πως αποθηκεύει τα καινούργια control στο winsock array που δημιουργεί για να δεχτεί τα νέα connections - βλ. function getNextAvailiableSocket().
George J.
|
|
-
03-04-2010, 21:04
|
-
ntaryl
-
-

-
Μέλος από τις 02-05-2006
-
User Mode yet
-
Δημοσιεύσεις 149
-
-
|
Απ: Socket Multithreading και Functions
Καλησπερα φιλε μου
Σου ευχομαι Καλη Ανασταση
Χpησιμοποιω το Async Multithreading Activex και απ οτι βλεπω υποστηριζει Multithreading .Δοκιμασα αρκετα παραδειγματα για Multithreading ολα σχεδον κρασαρανε και το πιο καλο απ ολα ηταν αυτο απο το thunderAsm.
Τελικα κατεληξα στο να χρησιμοποιησω το παραπανω activex που αναφερω .
Το παραδειγματακι σου καλο και σε ευχαριστω αλλα στο συγκεκριμενο στελνεις το αρχειο σε καθε πελατη.Τι γινετε στην περιπτωση που στελνει αρκετα δεδομενα στον πελατη ? Σημαινει οτι περιμενουμε να τελειωσει ο πρωτος για να στειλουμε στον επομενο
Δεν εχω προβλημα στο να δεχομαι η να χειριζομαι συνδεσεις
Το ολο σκεφτικο μου ειναι το να μπορω να χειριζομαι συνδεσεις την ιδια στιγμη και να στελνω δεδομενα ταυτοχρονα σε περισοτερο απο ενα πελατη ..
καλο βραδυ φιλε μου
Rookie learn to fly U are my Inspiration... Who said Multithreading is impossible Try it First and after Deside if is Possible
|
|
-
04-04-2010, 02:09
|
|
Απ: Socket Multithreading και Functions
Να υποθέσω ότι αναφέρεσαι σε αυτό το "Async"; Δεν το έχω χρησιμοποιήσει για να έχω μια άποψη τι μπορεί να κάνει, αλλά προσωπική θέση δεν θα χρησιμοποιούσα ένα προϊόν που η εταιρεία που το έχει αναπτύξει έχει πλέον κλείσει.
Δεν είναι ανάγκη, να τελιώσει ο ένας client για να εξυπηρετήσεις τον επόμενο. Βασικά αν ο καθένας πρέπει να έχει την δική του απάντηση, μετά το accept του connection, θα πρέπει να εξασφαλήσεις ότι έχεις πάρει όλο το request, και μετά του δίνεις την απάντηση που περιμένει. Αν ο κώδικας δεν είναι "tight", σε κάποια σημεία θα διακόπτεται η ροή του προγράμματος και θα σηκώνει καινούργιο connection, θα διαβάζει βάση, και θα απαντάει, για διαφορετικό client κάθε φορά, οπότε θα έχεις multi-tasking, μέσα στα όρια ισχύος του επεξεργαστή που θα το τρέχει. Ξαναλέω, δεν πρέπει ο κώδικας να είναι "tight", και η ροή πρέπει να είναι event-driven. Αυτό που έχω κάνει εγώ είναι αρκετά εξειδικευμένο μιας και όλοι οι clients έπρεπε να παίρνουν τα ίδια δεδομένα.
Με κώδικα παρόμοιο με τον παραπάνω, κατόρθωσα να εξυπηρετήσω 20-25 ταυτόχρονους clients, τρέχοντας σε ένα Windows NT v4.0 σύστημα. Η αλήθεια ήταν ότι 20-25 ήταν οι clients που ήταν στην ουρά για να εξυπηρετηθούν, ενώ πραγματικά εγώ είχα ένα, το πολύ δύο connections ανοιχτά - ο χρόνος που χρειαζόταν η VB6 να ανεβάσει ένα winsock control στην μνήμη και να ανοίξει TCP/IP επικοινωνία, ήταν πολύ μεγαλύτερος από τον χρόνο που χρειαζόμουν εγώ για να διαβάσω μια βάση μέσα από ODBC και να απαντήσω με 1Kb-1,5Kb δεδομένων.
Δύο - τρία χρόνια αργότερα όταν χρειάστηκε να κάνω παρόμοια δουλειά με περισσότερους ταυτόχρονους χρήστες, δεν το πάλεψα καθόλου, αλλά χρησιμοποίησα για την μία και μόνη φορά στην ζωή μου το SOAP Toolkit της Microsoft. Όλο εκείνο το fine-tuning, που είχα κάνει για να ξεφορτώνονται όλα τα control και να μην έχω memory leaks, όλες εκείνες οι αμέτρητες ώρες που πέρασα επάνω από το working instance για να είμαι σίγουρος ότι δεν χάνει δεδομένα και δεν φορτώνει στο 100% επεξεργαστή, απλώς δεν χρειάζοντουσαν, αφού όλο το φορτίο της δουλειάς το πήρε ο IIS, που πραγματικά το αντέχει...
Βέβαια, τότε είχα τις γκρίνιες που χρησιμοποιούσα τον IIS, και είχα φτιάξει ένα mini-web server σε VB6 για να μπορώ να τρέξω το server κομμάτι του SOAP, αλλά δεν το έβγαλα ποτέ στην παραγωγή. Ο IIS μπορεί να τρέξει επάνω και σε Windows XP ή όποιο άλλο client λειτουργικό, με τον περιορισμό των 10 ταυτόχρονων συνδέσεων, που αν θες να το περάσεις αυτό το όριο, ούτως ή άλλως, θα πρέπει να πας σε server λειτουργικό. Δεν το έχω αυτό το κομμάτι κώδικα πρόχειρο, αλλά και πάλι δεν νομίζω ότι αξίζει καν να ασχοληθείς αφού έχεις καλύτερη λύση και δωρεάν...
George J.
|
|
-
05-04-2010, 21:53
|
-
ntaryl
-
-

-
Μέλος από τις 02-05-2006
-
User Mode yet
-
Δημοσιεύσεις 149
-
-
|
Απ: Socket Multithreading και Functions
Ευχαριστω φιλε για το ενδιαφερον Το συγκεκριμενο activex το εχω και απλα το δοκιμαζω .Ολα αυτα πολυ σωστα τα λες αλλα οπως ειπα στην περιπτωση που υπαρχει μεταφορα δεδομενων συνεχεια αναγκαστικα πρεπει για κα8ε ενεργο Client να υπαρχει ενα thread ετσι ωστε να υπαρχει ταυτοχρονη μεταφορα Θα δοκιμασω και θα ποσταρω νεωτερες πληροφοριες καλο βραδυ
Rookie learn to fly U are my Inspiration... Who said Multithreading is impossible Try it First and after Deside if is Possible
|
|
-
05-04-2010, 22:25
|
-
vaggelis
-
-
-
Μέλος από τις 23-01-2010
-
-
Δημοσιεύσεις 8
-
-
|
Απ: Socket Multithreading και Functions
Για να απαντησω συγκεκριμενα στην ερωτηση σου, ασχετα με το technology που χρησιμοποιεις. To Socket Multithreading συνηθως δουλευει με το εξης σκεφτικο:
1. Το Main Thread (η το κυριως thread) "ακουει" στο port που θελεις. Το function που ακουει στο port mporei ειναι non blocking ή blocking Wisock call kai εξαρταται απο εαν το προγραμμα σου κανει τιποτα αλλο, εκτος απο το να περιμενει συνδεση. Υπαρχουν τα σχετικα function calls για αυτο, μην γραψεις κανενα δικο σου "while true loop" για blocing 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()...)
2. Οταν υπαρξει συνδεση, τοτε το control γυρναει στην επομενη γραμμη του "listen". Εκει αρχιζεις καινουργιο thread και περνας σαν parameter την δυνδεση (connection object), η stream, η τι αλλο που εχεις. Σου προτεινω να μην εχεις κανενα κωδικο εκει (validation, ktl). Βασικα καινουργιο thread σημαινει οτι εχεις ενα static function (συνηθως) με parameters αυτα που θελεις και οπου σιγουρευεις οτι καθε exception γινεται handled εκει μεσα, ειδικα αμα το τρεχεις με σε web server η αλλα "apartment threaded environments". Οταν το thread call γινει fired τοτε συνεχιζει ο κωδικος στο 1. (ξαναρχιζει το while loop, ή προχωρα ο κωδικος και κανει αλλα που θες) και ταυτοχρονα τρεχει και ο κωδικος στο 2.
Τωρα εαν εχεις απορια πως μπορει ο κωδικος στο 1 να τρεχει και να ακουει αφου κανεις πραγματα με τη συνδεση στο 2, η απαντηση ειναι οτι internally το Winsock call που ακουει στο port poυ θελεις εχει κανει re-assign το port σε αλλο dynamic port "behind the scenes" οποτε ο κωδικος στο 2. δουλευει με connection στο δυναμικο port, οποτε το κυριως port στο 1 ειναι ελευθερο παλι...
Ελπιζω να σου εδωσα μια ιδεα τοθ τι γινεται. Τωρα συγκεκριμενα με 3rd party Active X δεν ξερω εαν αυτο που χρησιμοποιεις ειναι γραμμενο καλα. Θα σου προτεινα να σιγουρευτιες οτι το ActiveX αυτο να ειναι "Free Threaded". To COM εχει settings για Single, Apartment kai free Threaded οταν τρεχει τετοια libraries. Μπορεις να αλλαξεις εσυ τι settings, αλλα συνηθως αυτα τα settings μπορει να κανουν crash το library, εξαρταται πως ειναι γραμμενο...
|
|
-
19-04-2010, 16:50
|
-
ntaryl
-
-

-
Μέλος από τις 02-05-2006
-
User Mode yet
-
Δημοσιεύσεις 149
-
-
|
Απ: Socket Multithreading και Functions
Καλησπερα παιδια Ειμαι παλι εδω με τις σκεψεις μου και τις αποριες μου Πειραματιστηκα αρκετα με το async και τελικα καταφερα να δημιουργησω ενα project στο οποιο χρησιμοποιω Socket api (vbip) .Καθε νεο Socket που δημιουργειται λειτουργει σε νεο Thread .Δηλαδη οταν κανει listening(Thread 1 ),Connect (thread 2 ) κτλπ Αργοτερα που θα βρισκομαι σπιτι θα ποσταρω μερικα screenshots απο το παραδειγμα . καλο απογευμα
Υ.γ Εχει πολυ διαβασμα ακομα .οταν τελειωσει με το καλο θα ποσταρω ενα μικρο παραδειγματακι
Rookie learn to fly U are my Inspiration... Who said Multithreading is impossible Try it First and after Deside if is Possible
|
|
-
19-04-2010, 23:39
|
-
ntaryl
-
-

-
Μέλος από τις 02-05-2006
-
User Mode yet
-
Δημοσιεύσεις 149
-
-
|
Απ: Socket Multithreading και Functions
ntaryl:Καλησπερα παιδια Ειμαι παλι εδω με τις σκεψεις μου και τις αποριες μου Πειραματιστηκα αρκετα με το async και τελικα καταφερα να δημιουργησω ενα project στο οποιο χρησιμοποιω Socket api (vbip) .Καθε νεο Socket που δημιουργειται λειτουργει σε νεο Thread .Δηλαδη οταν κανει listening(Thread 1 ),Connect (thread 2 ) κτλπ Αργοτερα που θα βρισκομαι σπιτι θα ποσταρω μερικα screenshots απο το παραδειγμα . καλο απογευμα
Υ.γ Εχει πολυ διαβασμα ακομα .οταν τελειωσει με το καλο θα ποσταρω ενα μικρο παραδειγματακι
Rookie learn to fly U are my Inspiration... Who said Multithreading is impossible Try it First and after Deside if is Possible
|
|
-
02-07-2010, 21:11
|
|
Απ: Socket Multithreading και Functions
Δεν ξέρω πως πάει η προσπάθεια για multithreading και sockets σε VB6, αλλά μόλις έγραψα ένα blog post για τους διάφορους τρόπους με τους οποίους γίνεται το asynchronous network programming στο .NET και είπα να ρίξω κι εδώ τον πιο σύντομο τρόπο μέχρι στιγμής, χρησιμοποιώντας τα Reactive Extensions. Το παράδειγμα χρησιμοποιεί pipes αλλά στο post έχω και παράδειγμα με sockets. Σε κανένα σημείο δεν χρειάζεται να χειριστώ εγώ threads ή synchronization, ενώ ο κώδικας μοιάζει σχεδόν με απλό κώδικα : public class ReactivePipes:IAsyncBase { protected NamedPipeServerStream serverPipe = new NamedPipeServerStream("MyName", PipeDirection.InOut, 100, PipeTransmissionMode.Message, PipeOptions.Asynchronous); protected NamedPipeClientStream clientPipe = new NamedPipeClientStream(".", "MyName", PipeDirection.InOut, PipeOptions.Asynchronous); public void StartServer() { var connect = Observable.FromAsyncPattern(serverPipe.BeginWaitForConnection, serverPipe.EndWaitForConnection); var read=Observable.FromAsyncPattern<byte[],int,int,int>(serverPipe.BeginRead,serverPipe.EndRead); var write=Observable.FromAsyncPattern<byte[],int,int>(serverPipe.BeginWrite,serverPipe.EndWrite); connect().Subscribe(u => { byte[] msg = new byte[20]; read(msg, 0, msg.Length).Subscribe(i => { var input =Encoding.UTF8.GetString(msg, 0,i); string message =String.Format("You sent {0}",input); byte[] buffer =Encoding.UTF8.GetBytes(message); write(buffer, 0, buffer.Length); }); }); } public void StartClient() { var read = Observable.FromAsyncPattern<byte[], int, int, int>(clientPipe.BeginRead, serverPipe.EndRead); var write = Observable.FromAsyncPattern<byte[], int, int>(clientPipe.BeginWrite, serverPipe.EndWrite); clientPipe.Connect(); var output = Encoding.UTF8.GetBytes("5"); write(output, 0, output.Length).Subscribe(u => { byte[] bytes = new byte[20]; read(bytes, 0, bytes.Length).Subscribe(i => { string message = Encoding.UTF8.GetString(bytes, 0, i); Console.WriteLine(message); }); }); } }
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
|
|
|