15. januar 2006 - 18:02Der er
12 kommentarer og 1 løsning
Chat server problemer.
Nu har jeg rodet med den kode som jeg fik her på eksperten .. Og ville prøve at lave en lille chat server.. Men den virker ikke helt optimalt .. Halvldelen af beskederne kommer nemlig ikke frem til hinanden, og andre af dem kommer frem på deres egen skærm .. Kun meget få blir sendt frem og tilbage .. - Hvordan kan det være? Har jeg fejl i min kode?, den compilleres fint .. Den ser sådan her ud:
Bertelbrander - Uh dejligt at høre svar, men hvad er mutex helt eksakt? Well, hvis der kommer en ny besked? Mit problem er egentlig at hvis der er 3 clienter online og den ene indtaster noget ... Så er det kun 1 ud af de 3 clienter som modtager .. Selvom den burde blive sendt til alle, og det er ganske tilfældigt hvem der modtager, det sker sågar at man selv modtager sin egen besked..
Jeg vil foreslå at du glemmer msgsend funktionen/tråden og sender direkte fra client funktionen. Sålænge mængden af data er lille bør det ikke være noget problem, vi kan godt lave en rigtig sende tråd senere.
Start med at slette linien: CreateThread(0, 0, msgsend, (LPVOID)&sd2, 0, &id2);
Og erstat: CHATMSG = cmd; Med: send(sd2,cmd,strlen(cmd),0);
Har jeg gjort nu, men nu modtager jeg beskederne selv .. Skal der ikke være en separeret tråd som kan sende ud til alle?.. - Problemet er at den ikke sender til alle .. :/
Jeg har ikke lavet servere før eller brugt accept, men du har ret, man skal jo sende til alle andre end den socket der modtog...
Så man kunne lave én sende tråd, og have en global liste af aktive forbindelser. Men man må skulle lave en ny socket for hver forbindelse der er accepteret, til det brug kan de to ekstra argumenter til accept bruges, de bruges til at få en sockaddr der kan bruges til at lave en socket.
Bertelbrander - Præcis, havde lavet en sende tråd som tog en global variable af besked.. Men.. Hvordan finder man aktive forbindelser? - Og kan du give mig et kort eksempel på hvordan jeg ku ændre sockaddr med de to ekstra argumenter? Ville være meget nyttigt ..
DWORD __stdcall client(void *p) { int sd2=*((int*)p); send(sd2,WELCOME,strlen(WELCOME),0); char buf[80]; memset(buf,0x00,sizeof(buf)); int ix=0; int len;
Det er ikke testet, men burde give en idé Der er stadig med et problem hvis man modtager flere beskeder ca samtidig, og et problem at sendmsg tråden vil æde alt cpu tid, men det er til at løse.
Hm, Ja kan godt se hvad du mener. Tror du vi kan få arne_v til at kigge på det? - Vil nemlig gerne have lavet 2 funktioner.. En til f.eks. Send_all(messages); også Send_user(messages); eventuelt dele users op efter ID.
Det burde ikke være noget større problem at lave de funktioner. Jeg har detsværre ikke så meget tid lige nu, men du kunne prøve at lave dem, så kan jeg hjælpe hvis der opstår problemer.
- Jeg husker at du ikke samler på point, så jeg ligger selv et svar :)
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.