Et klientprogram skal kontakte en lyttende (web)server (fast ip, fast port) for at fortælle at det er online. Derved får serveren også det dynamisk tildelte IP-nummer.
Nu skal klienten primært sætte sig til at lytte efter kommandoer fra web-serveren på en anden forudbestemt port, men skal være i stand til at sende alarm-meddelelser hvis situationer opstår. Jeg vil gerne undgå at serveren skal polle ”er der noget?” hele tiden, men bare lytte på førnævnte online-port.
- Det kræver 2 sockets, for en lyttende server kan ikke sende uopfordret, vel? - Hvordan håndteres kollisioner? Er de ikke noget problem fordi det er klienten der sender og venter mens serveren håndterer opgaven – og returnerer svar? Eller er det TCP der hjælper her? - Kan n-antal klientprogrammer lytte på den samme port (adskilt vha. deres IP) eller er det en lukket peer-to-peer forbindelse der kræver en port pr. klient? Hvis man kan, vil de alle modtage beskeden eller kan den rettes mod en bestemt (IP/port)? - Funktionen recv returnerer antal bytes modtaget. Er det den pågældende pakke eller er det den samlede datamængde i pipelinen? Med andre ord: Skal man have en header på data-delen?
Det var spørgsmålene, banale som de måske er. Jeg har kigget på internettet, læst Beej’s guide m.fl., men jeg mangler at få det her sat på plads.
Dette svar tager udgangspunkt i C kode, da du selv nævner beej's guide og funktionen recv.
1) "Det kræver 2 sockets, for en lyttende server kan ikke sende uopfordret, vel?" Du har jo din "accept-socket" som alle klienter connecter til, og den skal ikke bruges til andet. Et accept() kald returnerer en ny file descriptor (socket) til den specifikke klient. Så du ender op med 1 socket til at accepts og x antal sockets for x connectede klienter. Sockets er jo to-vejskommunikation så det er nok med en socket til hver klient, men du kan naturligvis ikke lytte efter beskeder samtidig med at du også vil sende data den anden vej - ikke hvis du gør det i samme tråd/proces vel at mærke. Det kan løses på mange måder, en af dem er at anvende posix tråde (pthread). Søg på google hvis du ikke kender begrebet. Du kan så sætte en tråd op til at lytte hele tiden, og sende data den anden vej fra en anden tråd. Hvis du har mange klienter (måske >20), eller bare er perfektionist vil jeg anbefale at du kigger nærmere på select() kaldet som også er beskrevet i beej så vidt jeg husker. Altså, kun en socket per klient, og på server-siden er det den der returneres i accept kaldet.
2) "Hvordan håndteres kollisioner? Er de ikke noget problem fordi det er klienten der sender og venter mens serveren håndterer opgaven – og returnerer svar? Eller er det TCP der hjælper her?" Jeg er lidt usikker på hvad du mener med kollisioner, hvis du referer til om data sendes frem og tilbage asynkront, det vil sige at klienten både skal kunne modtage og sende data på et hvilket som helst tidspunkt, skal klienten også designes så der er en tråd der lytter, og en anden tråd der sender (men på samme socket vel at mærke).
3) "Kan n-antal klientprogrammer lytte på den samme port (adskilt vha. deres IP) eller er det en lukket peer-to-peer forbindelse der kræver en port pr. klient?" Ja det kan de godt, serveren sender jo til en bestemt socket (klient) og derfor vil kun den pågældende klient modtage beskeden. Men du skal jo ikke angive en port på klientsiden, det bliver automatisk sat op af styresystemet. Igen, du bruger bare den ene socket som klienten connecter til serveren med.
4) "Funktionen recv returnerer antal bytes modtaget. Er det den pågældende pakke eller er det den samlede datamængde i pipelinen? Med andre ord: Skal man have en header på data-delen?" Signaturen for recv er int recv(int sockfd, void *buf, int len, unsigned int flags) Funktionen læser maximalt len bytes ind i buf og returnerer det antal bytes der rent faktisk blev puttet ind i buf. Der kan godt være flere data i pipelinen end du har læst ind, og du kan heller ikke være sikker på at al data når frem samtidigt. En ide kunne være at sætte en "start byte" på inden din data og en "slut byte" efter, således at du på modtager siden kan se om du har fået læst hele beskeden ind. Du kan også angive længden af data som det første du sender så du ved hvor meget du skal læse.
Håber det hjælper, ellers må du lige skrive igen :)
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.