ntaryl Δημοσ. 27 Μαΐου 2010 Δημοσ. 27 Μαΐου 2010 καλημερα παιδια Ακομα ασχολουμε με το να φτιαξω ενα Multithread παραδειγματακι .Χρησιμοποιω την CreateThread και με συνδυασμο Socket api καταφερα κατι .Θα επισυναψω το Screenshot.. Το συγκεκριμενο ειναι απο το Thread της Listen . Θελω να μου εξηγησει καποιος την λογικη της καθε Function Ως ωρας ξερω και εχω υλοποιησει οτι το να κανεις listening πρεπει να τρεχει σε ενα Thread ... Απο εδω και περα ομως πως κανουμε Accept μιας νεας συνδεση ?.διαβασα οτι χρησιμοποιουμε Infinite Loop και οχι Συμβαντα(Connection Request). Καποιος που θα μπορουσε να με βοηθησει πανω σε αυτο. Καποιος που εχει εμπειρια πανω σε MultiThreading ? Καλο βραδυ ...
karabouzouk... Δημοσ. 27 Μαΐου 2010 Δημοσ. 27 Μαΐου 2010 Την πρώτη σύνδεση πώς την έκανες accept..? Μέσα σε ένα loop που δεν θα τελειώνει θα κάνεις accept με τον ίδιο ακριβώς τρόπο.. και κάθε φορά που θα δεχεσαι μια καινούρια σύνδεση θα μπορούσες να δημιουργείς και ένα καινούριο thread για να την διαχειρίζεται ανεξάρτητα από τις άλλες, αλλά αυτό εξαρτάται πάντα από την υλοποίηση και τον τύπο του προγράμματοσ σου. Τι πρόγραμμα φτιάχνεις μόνο να συνδέεται και να αποσυνδέεται για αρχή..? Αν έχεις κάποια στοιχειώδη ιδέα από C μπορώ να σου δώσω ένα server και έναν client προγραμματάκι για απλό Chat που έκανα να δεις το γενικό σκεπτικό.. ο server είναι υλοποιημένος να διαχειρίζεται κάθε έναν client σειριακά, δλδ μόλις έρχεται μύνημα τότε να το διαχειρίζεται.. και ο client είναι με threading.. ενα thread για να ακούει για εισερχόμενα μυνήματα τα οποία λαμβάνει και εμφανίζει καί ένα για να περιμένει τον χρήστη πότε θα πληκτρολογίσει κάτι για να το στείλει στο server ο οποίος και θα το διαμοιράσει στους υπολοίπους.. (θα μπορούσα να χρησιμοποιήσω threads και στο πρόγραμμα-server αλλά δεν μπόρεσα να λύσω κάποια θέματα με κοινή χρήση μνήμης. οπότε βλέπεις ότι και χωρίς threads γίνεται να ακούς για νέες συνδεσεις (listen) αλλά και να διαχειρίζεσαι τους ήδη συνδεδεμένους clients αλλά ΟΧΙ ταυτόχρονα..είναι όλα θέμα σχεδιασμού) αν μπορώ να σε βοηθήσω σε κάτι θεωρητικά έστω, μιας και δεν έχω ασχοληθεί πολύ με visual basic πες μου..
ntaryl Δημοσ. 27 Μαΐου 2010 Μέλος Δημοσ. 27 Μαΐου 2010 Καλησπερα Φιλε μου δεν εχω υλοποιησει το Accept γιατι δεν ξερω το πως ακριβως λειτουργει σε επιπεδο MultiThreading . Εχω δουλεψει σε επιπεδο single Thread μονο. Δεν ξερω και παρα πολυ καλα C την χρειαστηκα καποιες περιπτωσεις να μελετησω κατι . Αν ο κωδικας ειναι απλος και εχει conmments τοτε δεν θα υπαρχει προβλημα. Συγκεκριμενα ψαχνω να βρω πληροφοριες το πως να υλοποιησω το Accept Thread και το Send -Get Data . Αν θες ποσταρισε τον κωδικα του Multithread Client να το μελετησω μπας και βγαλω ακρη. Φτιαχνω ενα παραδειγματακι για να δω πως υλοποιουνται οι συγκεκριμενες Functions . Καθε βοηθεια πολυτιμη . κ
karabouzouk... Δημοσ. 28 Μαΐου 2010 Δημοσ. 28 Μαΐου 2010 Την 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..
PotirasK.O Δημοσ. 28 Μαΐου 2010 Δημοσ. 28 Μαΐου 2010 ο κωδικας δεν ειναι δικος μου. αλλα ειναι ακριβως οτι χρειαζεσαι. >#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; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.