Προς το περιεχόμενο

Accept & Multithreading (VB)


ntaryl

Προτεινόμενες αναρτήσεις

Δημοσ.

καλημερα παιδια

 

Ακομα ασχολουμε με το να φτιαξω ενα Multithread παραδειγματακι .Χρησιμοποιω την CreateThread και με συνδυασμο Socket api καταφερα κατι .Θα επισυναψω το Screenshot..

 

Το συγκεκριμενο ειναι απο το Thread της Listen .

 

Θελω να μου εξηγησει καποιος την λογικη της καθε Function

 

Ως ωρας ξερω και εχω υλοποιησει οτι το να κανεις listening πρεπει να τρεχει σε ενα Thread ...

 

Απο εδω και περα ομως πως κανουμε Accept μιας νεας συνδεση ?.διαβασα οτι χρησιμοποιουμε Infinite Loop και οχι Συμβαντα(Connection Request).

 

Καποιος που θα μπορουσε να με βοηθησει πανω σε αυτο.

 

Καποιος που εχει εμπειρια πανω σε MultiThreading ?

 

Καλο βραδυ ...

post-45627-129063092201_thumb.jpg

post-45627-129063092206_thumb.jpg

Δημοσ.

Την πρώτη σύνδεση πώς την έκανες accept..? Μέσα σε ένα loop που δεν θα τελειώνει θα κάνεις accept με τον ίδιο ακριβώς τρόπο.. και κάθε φορά που θα δεχεσαι μια καινούρια σύνδεση θα μπορούσες να δημιουργείς και ένα καινούριο thread για να την διαχειρίζεται ανεξάρτητα από τις άλλες, αλλά αυτό εξαρτάται πάντα από την υλοποίηση και τον τύπο του προγράμματοσ σου.

 

Τι πρόγραμμα φτιάχνεις μόνο να συνδέεται και να αποσυνδέεται για αρχή..?

 

Αν έχεις κάποια στοιχειώδη ιδέα από C μπορώ να σου δώσω ένα server και έναν client προγραμματάκι για απλό Chat που έκανα να δεις το γενικό σκεπτικό.. ο server είναι υλοποιημένος να διαχειρίζεται κάθε έναν client σειριακά, δλδ μόλις έρχεται μύνημα τότε να το διαχειρίζεται.. και ο client είναι με threading.. ενα thread για να ακούει για εισερχόμενα μυνήματα τα οποία λαμβάνει και εμφανίζει καί ένα για να περιμένει τον χρήστη πότε θα πληκτρολογίσει κάτι για να το στείλει στο server ο οποίος και θα το διαμοιράσει στους υπολοίπους..

(θα μπορούσα να χρησιμοποιήσω threads και στο πρόγραμμα-server αλλά δεν μπόρεσα να λύσω κάποια θέματα με κοινή χρήση μνήμης. οπότε βλέπεις ότι και χωρίς threads γίνεται να ακούς για νέες συνδεσεις (listen) αλλά και να διαχειρίζεσαι τους ήδη συνδεδεμένους clients αλλά ΟΧΙ ταυτόχρονα..είναι όλα θέμα σχεδιασμού)

 

αν μπορώ να σε βοηθήσω σε κάτι θεωρητικά έστω, μιας και δεν έχω ασχοληθεί πολύ με visual basic πες μου..

Δημοσ.

Καλησπερα

Φιλε μου δεν εχω υλοποιησει το Accept γιατι δεν ξερω το πως ακριβως λειτουργει

σε επιπεδο MultiThreading .

Εχω δουλεψει σε επιπεδο single Thread μονο.

Δεν ξερω και παρα πολυ καλα C την χρειαστηκα καποιες περιπτωσεις να μελετησω κατι .

Αν ο κωδικας ειναι απλος και εχει conmments τοτε δεν θα υπαρχει προβλημα.

Συγκεκριμενα ψαχνω να βρω πληροφοριες το πως να υλοποιησω το Accept Thread και το Send -Get Data .

Αν θες ποσταρισε τον κωδικα του Multithread Client να το μελετησω μπας και βγαλω ακρη.

 

Φτιαχνω ενα παραδειγματακι για να δω πως υλοποιουνται οι συγκεκριμενες Functions .

Καθε βοηθεια πολυτιμη .

 

 

 

 

κ

Δημοσ.

Την accept την καλείς για να δεχθείς μια σύνδεση από αυτές που περιμένουν να συνδεθούν και έτσι δημιουργείται μια socket που μέσω αυτής μπορείς να στείλεις και να λάβεις δεδομένα στον υπολογιστή στον οποίο αναφέρεται αυτή η socket.

(στη C υπήρχε έτοιμη συνάρτηση που έκανε την αποδοχή μιας αίτησης.. στη visual basic δεν υπάρχει κάτι παρόμοιο..?)

Μόλις αποδεχθείς τη σύνδεση τότε δημιουργείς και ένα thread το οποίο δουλειά του θα είναι να εξυπηρετήσει την socket που μόλις δημιούργησες με την accept.

 

Έτσι θα μπορείς ταυτόχρονα να ξαναεπιστρέψεις στην αρχή του infinite loop που λέγαμε για να δεχθείς και άλλες συνδέσεις, αλλά και να εξυπηρετείς την κάθε μια σύνδεση χωρίς να σε ενδιαφέρει πόσο θα καθυστερήσει (αφού είναι σε διαφορετικά threads)..!

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

 

(Το πρόγραμμα του client που σου είπα νομίζω πιο πολύ θα σε μπερδέψει παρά θα σε βοηθήσει.. καλύτερα να προσπαθήσεις να το υλοποιήσεις με το σκεπτικό που σου είπα πιο πάνω)

 

---------- Προσθήκη στις 01:47 ---------- Προηγούμενο μήνυμα στις 01:36 ----------

 

Απ' ότι είδα σε μια πρόχειρη αναζήτηση ( http://www.osix.net/modules/article/?id=25 ) τα πράγματα είναι παρόμοια με τη C..

Συμπεριλαμβάνεις το Microsoft Winsock Control 6.0 στην φόρμα σου και μετά απλά χρησιμοποιείς τις έτοιμες συναρτήσεις όπως εξηγεί παρακάτω..

Αφού εξοικειωθείς με αυτά τότε με παρόμοιο τρόπο μπορείς να προχωρήσεις και σε multithreading υλοποίηση... λογικά θα υπάρχουν άπειρα παραδείγματα στο internet..

Δημοσ.

ο κωδικας δεν ειναι δικος μου.

 

αλλα ειναι ακριβως οτι χρειαζεσαι.

 

>#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <string.h>

DWORD WINAPI MyThreadFunction( LPVOID lpParam );

int main (vold)
{
 SOCKET s, con;
 struct sockaddr_in addr; // the address structure for a TCP socket
 size_t addr_size;
 DWORD   dwThreadId;
 HANDLE  hThread; 
 int threadCount = 0;

 // Must be done at the beginning of every WinSock program
 WSADATA w;    // used to store information about WinSock version
 int error = WSAStartup (0x0202, &w);   // Fill in w

 if (error)
 { // there was an error
   return -1;
 }
 else
   fprintf(stdout, "Winsock v%d.%d initialized\n", 
           LOBYTE(w.wVersion), HIBYTE(w.wVersion));

 if (w.wVersion != 0x0202)
 { // wrong WinSock version!
   WSACleanup (); // unload ws2_32.dll
   return -1;
 }

 s = socket (AF_INET, SOCK_STREAM, 0); // Create socket

 addr.sin_family = AF_INET;      // Address family Internet
 addr.sin_port = htons (5555);   // Assign port 5555 to this socket
 addr.sin_addr.s_addr = htonl (INADDR_ANY);   // No destination
 addr_size = sizeof(addr);
 if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
 { // error
   WSACleanup ();  // unload WinSock
   return -1;         // quit
 }

 if (listen(s, 5) == SOCKET_ERROR) /* 5 = max length of the queue of pending connections */
 { // error!  unable to listen
   WSACleanup ();
   return -1;
 }
 while(1)
 {
   con = accept(s, (struct sockaddr*)&addr, &addr_size);

   hThread = CreateThread( 
       NULL,
       0,
       MyThreadFunction,
       (LPVOID)con,
       0,
       (LPDWORD)&dwThreadId);
 }
 
 closesocket(s);
 WSACleanup ();
 return (1);
}

DWORD WINAPI MyThreadFunction( LPVOID lpParam ) 
{ 
   SOCKET s;
   char buffer[128];
   int n, i;

   s = (SOCKET)lpParam;

   while(1) 
   {
     n = recv(s, buffer, sizeof(buffer), 0);
     if (n == SOCKET_ERROR)
     {
       fprintf(stderr,"Server: recv() failed: error %d\n", WSAGetLastError());
       fprintf(stderr,"Server: resetting socket\n");
       closesocket(s);
       break;
     }
     else
       printf("Server: recv() is OK.\n");

     if (n == 0)
     {
       printf("Server: Client closed connection.\n");
       closesocket(s);
       break;
     } else {
       printf("Server: Received %d bytes from client\n", n);
       for(i=0;i<n;i++)
         fprintf(stderr,"data[%d]=%d", i, (unsigned char)buffer[i]);
     }
   }

   return 0; 
}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...