09. januar 2006 - 10:10Der er
19 kommentarer og 1 løsning
Multithreaded server.
Hej Igen Eksperten .. - Nu har jeg umiddelbart leget lidt med multithreading ... Og har brygget et stykke kode sammen, som i sidste ende gerne skulle ligne en multithreaded server. - Jeg har sat den til at loope acceptere connections. Men umiddelbart virker det ikke.. Har 2 spørgsmål: #1 - Den siger fejl ved P "undeclared" #2 - Ser min kode fornuftig ud som helhed? Min kode ser sådan her ud:
Hov .. Har selv fundet svaret på mit første spørgsmål .. Havde glemt at sætte variablerne ind .. Og har ændret lidt i koden .. Så den kan godt compiles .. Men når jeg kører mit program bliver den helt vild og skriver "kunne ikke lytte til socket.. Kunne ikke starte socket .." når man prøver at connecte. Min kode ser nu sådan her ud:
int main() { WSADATA WSAData; WSAStartup(0x0101,&WSAData); //WSA Startup sd=socket(AF_INET,SOCK_STREAM,0); // Skaber Socket if(sd<0) { printf("Kunne ikke skabe socket: %s\n",strerror(errno)); } local.sin_family=AF_INET; //Binder socket local.sin_port = htons(8888); // Binder socket til port nummer 1234 local.sin_addr.s_addr = INADDR_ANY; // Binder socket til local IP status=bind(sd,(struct sockaddr *)&local,sizeof(local)); if(status<0) { printf("Kunne ikke binde socket: %s\n",strerror(errno)); } status=listen(sd,5); // Lyttende Socket if(status<0) { printf("Kunne ikke lytte til socket: %s\n",strerror(errno)); } while(1) { sd2=accept(sd,0,0); // Acceptere Connections if(sd2<0) { printf("Kunne ikke acceptere socket: %s\n",strerror(errno)); } DWORD ThreadId; DWORD MainThreadId = GetCurrentThreadId(); cout << "New connection comming." << std::endl; CreateThread(0, 0, ThreadFunc, (LPVOID )MainThreadId, 0, &ThreadId); cout << "New connection startet." << std::endl; } closesocket(sd2); // Lukker SD2 Socket closesocket(sd); // Lukker SD Socket WSACleanup(); //WSA Cleanup system("Pause"); return 0; }
- Altså .. Der er nu opstået et nyt problem .. Når den ene har connectet kører det fint .. Men hvis så 1 mere prøver at connecte får han kun "Welcome" beskeden .. Også kører begge konsoller uden respons .. Er der en løsning på det?
Nu har jeg umiddelbart flyttet SD2 væk fra global og op til tråden.. Men nu sender den overhovedet ikke respons .. Kun sort vindue .. Dvs. Den får forbindelse men ingen respons ..
Hm, umiddelbart kunne det godt se sådan ud .. Selv om jeg har tilladt dem .. Men det er vel intet med c++ koden .. Så det spørgsmål hører nok ikke til her inde :) - Men hvis jeg vil lave en thread mere .. Kan jeg så ikke skrive: DWORD __stdcall newthread(void *p) i stedet for "DWORD __stdcall client(void *p)" ?
Umiddelbart ser det ikke ud til den starter tråden .. Over tråden "client" lavede jeg en tråd funktion som hed "DWORD __stdcall msgsend(void *p)" Og da jeg ville kører tråden skrev jeg: DWORD id; CreateThread(0, 0, client, (LPVOID)&sd2[n], 0, &id); - Men den ville ikke compillere.. Så ændrede det til: DWORD it; CreateThread(0, 0, client, (LPVOID)&sd2[n], 0, &it); - Altså med "IT" i stedet for "ID" .. Så kunne den godt compillere, men tråden startede ikke ..
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.