Jeg er lige gået i gang med at lære mig en smule C - jeg vil gerne ha' en socketforbindelse til at køre (i første gang bare en client socket, men senere skal jeg også ha' en server socket til at virke)
Jeg har fået lavet en socket forbindelse af en slags - hvilket vil sige at jeg godt kan få den til at læse eller skrive over en socket, det er jo også en fin nok start..
mit problem er at jeg kender til andre programmeringssprog, der gælder det at der er en event, hvor der sker ting - OnSocketRead - eller hvad de forskellige sprog nu vælger at kalde det..
I C skal man, så vidt jeg har set, ha' en do {} while for at få det til at virke.
Mit problem er at det kommer til at virke 'blocking' når jeg laver noget.
Altså.. hvis vi nu antager at jeg vil ha' lov til at køre f.eks. en irc-klient - så skal den hele tiden læse fra socket - men den skal også kunne reagere på det jeg skriver til den. Som jeg har fået det til at virke, så går den i stå, mens den venter på at jeg skriver noget - hvilket vil sige at hvis jeg ikke skriver noget konstant, så bliver der ikke læst fra socket'en.
Nogle der har nogle eksempler på hvordan det skal laves (antager at det kun er noget inden for do{}while jeg skal ha fat i)
og nej, jeg er ikke interesseret i nogle lib's der er specielt rettet mod irc, det er et generelt socketspørgsmål :)
(og nej vil ikke ha' af vide at jeg hellere skulle lære C++, det kommer jeg måske til på et senere tidspunkt)
tråde lyder fornuftigt, ja - hvordan bruger man dem i C ?
og hvordan winsock har det med det er irrelevant, jeg vil køre det på en bsd maskine - men det er når den venter på input fra mig/stdin at den 'går i stå' - så timeout på socket'en's timeout er vel ikke så relevant? det skal vel nærmere være en stdin timeout - det lyder bare grotesk..
Så er dit problem at bruger input blokere for din kommunikation, det løses ved at have 2 tråde der begge blokere på henholdsvis input og socket og venter på at der sker noget.
hald@freebsd ~/c/threads #gcc hello.c /tmp/ccsefWif.o: In function `main': /tmp/ccsefWif.o(.text+0x36): undefined reference to `pthread_create' /tmp/ccsefWif.o(.text+0x4a): undefined reference to `pthread_exit' /tmp/ccsefWif.o: In function `thrdfun': /tmp/ccsefWif.o(.text+0x7a): undefined reference to `pthread_exit'
jeg er ganske usikker på hvad det skyldes... at pthread_exit og create ikke findes i den .h der er included, eller ?
er der flere versioner af den, eller sådan noget?
nogle der har et eksempel der virker og kan kompileres, som jeg kan glo på ?
Brug evt. bare select() Den kan godt både lytte om der sker noget på din socket og dit tastatur. Den kan se begge som streams. Du kan også sætte en option på din socket som gør den til nonblocking. Så når du læser fra din socket vil den fortælle at der ikke er noget/nok at læse. Man kan fortælle den at der mindst skal være en bestemt mængde data for at den skal returnere at der er noget at læse. Nonblocking option: O_NONBLOCK og skal vist bruges med option F_SETFL Datamængde: (Søg efter lowwater mark) SO_RCVLOWAT og SO_SNDLOWAT og bruges sammen med select()
Jeg bruger g++ 3.3.? på Debian GNU (Linux) Sæt den til nonblocking med fcntl: // fd er din socket descriptor int flags; /* Sæt nonblocking */ if ((flags = fcntl(fd, F_GETFL, 0)) < 0) err_sys("F_GETFL fejl"); //fejl flags |= O_NONBLOCK; // sæt option if (fcntl(fd, F_SETFL, flags) < 0) err_sys("F_SETFL fejl");
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.