Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Recv Function σε NoBlockingMode και Κρασαρισμα

Îåêßíçóå áðü ôï ìÝëïò ntaryl. Τελευταία δημοσίευση από το μέλος ntaryl στις 20-07-2011, 20:06. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-07-2011, 20:00 66603

    Recv Function σε NoBlockingMode και Κρασαρισμα

    Καλησπερα  

    Προσπαθω να τελειωσω το Multithread παραδειγμα που εχω αρχισει  .

    Οταν  αφηνω τα Sockets σε Blocking Mode τοτε  με επιτυχια περναω το Accept Handle σε ενα νεο thread(Workthread)

    Και στελνω με επιτυχια δεδομενα.

    Μολις αλλαξω σε NoblockingMode

    Dim NonBlock As Long 
     NonBlock = 1 
     If ioctlsocket (nRet, FIONBIO, NonBlock) = SOCKET_ERROR Then 
     WriteLog "Socket Cannot Set NoBlocking" 
     End If
    Ο Client συνδεεται κανονικα ανοιγει το νεο Thread και με το που περναει στην Recv Κρασσαρει εδω
    ReadBuff = Left$(ReadBuff, sRec)
    Ο παρακατω κωδικας που επισυναπτω ειναι η υλοποιηση του workthread
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Public Function Workthread (ByVal Param As Long) As Long 
     Const MAX_BUFFER_LENGTH As Long = 8192 'Normal = 8192' MAX = 65536 
     Dim Buffa (1 To MAX_BUFFER_LENGTH) As Byte 
     Dim dBuff As String 
     Dim ReadBuff As String 
     Dim sRec As Long 
     tID = GetCurrentThreadId 
     Add_DataClientStore ClientCount, nRet, tID''/ / Store Data in a public type (sockid, threadid) 
     WriteLog "New Client Arrive with Socket ID" & nRet & "On Thread ID:" & tID''/ / write data to listbox 
     Do''While True 
    
     ClientStore (ClientCount). Sock_ID = nRet 
     sRec = recv (ClientStore (ClientCount). Sock_ID, Buffa (1), MAX_BUFFER_LENGTH, 0 &) 
     ReadBuff = StrConv (Buffa, vbUnicode) 
     dBuff = Left $ (ReadBuff, sRec) 
     WriteLog "Data Received.:" & DBuff & "Socket ID ..." & ClientStore (ClientCount). Sock_ID 
     End If 
     Loop 
     End Function
    Αν μπορει καποιος να μου πει γιατι κρασαρει εδω ?

    καλο Βραδυ

    Υ.γ : Οποιαδηποτε συμβουλη δεκτη .Ειμαι πρωταρης σε threads








    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
  •  19-07-2011, 20:41 66604 σε απάντηση της 66603

    Απ: Recv Function σε NoBlockingMode και Κρασαρισμα

    Καταρχήν δεν εξηγείς τί θα πει "κρασάρει". Τί μήνυμα σου βγάζει? Γιατί πάω στοίχημα ότι σου λέει ότι το μήκος που έδωσες είναι πολύ μεγάλο.

    Όπως έχουμε ξαναπεί κάθε φορά που κάνεις μία παρόμοια ερώτηση, το πρόβλημα δεν είναι ότι είσαι πρωτάρης σε threads ή το multithreading. Είναι ότι επιμένεις να χρησιμοποιείς ένα C API (το Win32 API) μέσα σε μία γλώσσα η οποία δεν φτιάχτηκε ποτέ ούτε για multithreading ούτε για να καλεί C functions απευθείας. Όταν καλείς το Win32 API πρέπει να προσέχεις για παράδειγμα το πως περνάς και διαβάζεις strings.

    Ο τύπος string της VB δεν έχει σχέση με το string της C. Τα string της VB είναι ΠΑΝΤΑ unicode και αρχίζουν με το μήκος του string. Τα string της C είναι απλά ένας pointer σε ένα πίνακα από char που καταλήγει σε null. Η StrConv ΔΕΝ μετατρέπει τη μία μορφή σε άλλη, μετατρέπει ένα VB String σε ένα άλλο VB String . Πάω στοίχημα μάλιστα ότι η StrConv πρέπει να σου επιστρέφει κενό, αν και θα περίμενα εκεί να σκάσει και όχι στη Left. Μήπως έχεις βάλει κανένα On Error Resume Next?

    Αν δούλευες με C++ ή έστω με C θα μπορούσες να κάνεις εύκολα τη μετατροπή με ένα cast ή καλώντας την SysAllocString. Στην VB6 θα πρέπει να κάνεις μερικές "τούμπες":

    1. Να φτιάξεις ένα VB string αρκετά μεγάλο για να χωρέσει ολόκληρο το string, γεμάτο με 0
    2. Να αντιγράψεις τα περιεχόμενα του C string στο νέο buffer
    3. Να "κόψεις" το buffer στο πρώτο null που θα συναντήσεις

    Η διαδικασία περιγράφεται στο βιβλίο Win32 API Programming with Visual Basic 6, Κεφ. 6 το οποίο ευτυχώς ο O'Reilly έχει online. Ψάξε για την παράγραφο "From LPSTR to BSTR". Η παράγραφος αυτή χρησιμοποιεί το Win32 API function CopyMemory για να αντιγράψει τα περιεχόμενα του LPSTR και ένα function που περιγράφεται αλλού στη σελίδα, το Trim0, για να κόψει το buffer στο πρώτο Null.

     

    Γιατί επιμένεις πάντως να χρησιμοποιείς τη VB6 σε ένα σενάριο που είναι εντελώς ακατάλληλη να χειριστεί? Αν έγραφες έστω και σε C θα ήταν πολύ ευκολότερα τα πράγματα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-07-2011, 21:50 66605 σε απάντηση της 66604

    Απ: Recv Function σε NoBlockingMode και Κρασαρισμα

    Συνημμένα: Error.JPG
     Καλησπερα Φιλε Παναγιωτη   

    Οντως με εχει πιασει μια εμμονη με την Visual basic .

    Σκαει στην γραμμη  που ανεφερα παραπανω και οχι στην  StrConv  .Εκανα  Debugging  και την περασε αυτη την γραμμη.

    Δεν εχω χρησιμοποιησει (On Error Resume Next)

    το μηνυμα που μου  βγαζει επισυναπτεται παρακατω  

    Σε ευχαριστω πολυ για το υλικο  που ανεφερες  ..

    καλη συνεχεια  





    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
  •  19-07-2011, 21:59 66606 σε απάντηση της 66605

    Απ: Recv Function σε NoBlockingMode και Κρασαρισμα

    Για βάλε λοιπόν ένα watch στο ReadBuff και θα δεις ότι δεν έχει το μέγεθος που περιμένεις


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-07-2011, 22:15 66607 σε απάντηση της 66606

    Απ: Recv Function σε NoBlockingMode και Κρασαρισμα

    Καλησπερα  παλι  

    στην  γραμμη  (ReadBuff = StrConv(Buffa, vbUnicode))

    η Readbuff ειναι αδεια οπως το ειπες .Γμτ  

    παρολο που εχει Len 8192


    Τι θα πρεπει να κανω για να λυθει το error  

    Ευχαριστω πολυ  

    P.s Παραπανω  αναφερεις την SysAllocString .

     Δεν μπορουμε να την χρησιμοποιησουμε στην VB ?





    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
  •  20-07-2011, 20:06 66620 σε απάντηση της 66607

    Απ: Recv Function σε NoBlockingMode και Κρασαρισμα

    καλησπερα  Φιλε μου  

    Τροποποιησα λιγακι το workthread και δουλεθει Αψογα το καθε thread  

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Public Function Workthread(ByVal Param As Long) As Long
    ThreadInit.InitThread
    Dim DBuff As String
    Dim ReadBuff As String
    Dim sRec As Long
    tID = GetCurrentThreadId
    Add_DataClientStore ClientCount, nRet, tID
    WriteLog "New Client Arrive with  Socket ID " & nRet & " On Thread   ID:" & tID
    Do  ''While True
    DBuff = Space(4096)
    ClientStore(ClientCount).Sock_ID = nRet
    sRec = recv(ClientStore(ClientCount).Sock_ID, ByVal DBuff, Len(DBuff), 0)
    If sRec <> 0 And sRec <> SOCKET_ERROR Then
    ReadBuff = ReadBuff & Left(DBuff, sRec)
    WriteLog "Data Received.:" & ReadBuff & " Socket ID..." & ClientStore(ClientCount).Sock_ID
    End If
    DoEvents
    Loop Until sRec = 0
    End Function
    Καλο βραδυ   


    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems