Avatar billede tax Nybegynder
07. december 2001 - 08:31 Der er 14 kommentarer og
1 løsning

BSD sockets

Jeg arbejder på en kommunikationsløsning imellem en windowsmaskine og en WxWorks boks. Jeg bruger BSD sockets, men har problemer med at recv() bloker.
Er der en metode til at spørge om der er kommet data på socketten, så jeg er fri fra at blokere?
Avatar billede tax Nybegynder
07. december 2001 - 08:38 #1
Blokerer datagram sockets også?
Avatar billede tax Nybegynder
07. december 2001 - 08:52 #2
Jeg kan læse at select() kan anvendes men hvordan?
Avatar billede alvion Nybegynder
07. december 2001 - 08:57 #3
Har du prøvet at bruge recv() til at \"peak\'e\" ?

Prøv at kalde recv() med flaget MSG_PEEK. Så skulle funktionen gerne returnere antallet af bytes, der venter i køen.
Avatar billede tax Nybegynder
07. december 2001 - 09:10 #4
MSG_PEEK blokerer også, den anvendes til at læse det indkomne data uden at det fjernes fra bufferen
Avatar billede alvion Nybegynder
07. december 2001 - 10:47 #5
Ja så er jeg lissom udtømt for idéer...

Gør det noget at den blokker? Kan du ikke bare lade socket-læsningen ske i en separat tråd?

Vi snakkede jo sammen i et tidligere spørgsmål omkring det Windows kan gøre med at sende en message, når der var nye data. Det kan du selv simulere:

1) Du laver en inddata-kø, som en semafor (dvs. kun 1 tråd kan tilgå den af gangen)

2) Din main-thread starter en worker-thread

3) Din worker-thread står og læser fra socketen med recv() (og blokker). Når den modtager data (og recv() returnerer), indsættes disse i inddata-kø, og worker-threaden læser igen fra socket\'en

4) Din main-thread checker periodisk om der er nye data i inddata-køen, og hvis der er, hentes de og behandles.


Ovenstående model kan peppes lidt op. Din worker thread kan sende en message til main-thread\'en, efter at data er proppet i inddata-køen. Dermed behøver main-thread\'en ikke aktivt at undersøge inddata-køen.
Avatar billede tax Nybegynder
07. december 2001 - 10:51 #6
Problemet er at jeg ikke kan sende når read blokker.

Det skal bruges til at skabe forbindelse til en simulator, hvor hændelserne kommer asynkront.

Jeg kunne oprette to tråde en til at sende og en til at modtage, men jeg har ikke lyst til at bruge to sockets. Måske er jeg tvunget til det hvis jeg bruger BSD?
Avatar billede tax Nybegynder
07. december 2001 - 10:55 #7
Ellers skal jeg hele tiden udveksle en \"tom\" besked, når der ikke er noget at sende, for at read ikke blokerer så længe. Men det er en dum løsning.

-Og det er en del af mit eksamensprojekt, så jeg ville gerne gøre det ordentligt. :)

Måske kan man forsvare ping-pong princippet ved at jeg heletiden ved om forbindelsen \"lever\"?
Avatar billede alvion Nybegynder
07. december 2001 - 11:06 #8
Jeg ville gå efter løsningen med 2 sockets, når det er asynkront.
Avatar billede alvion Nybegynder
07. december 2001 - 11:09 #9
2 sockets
2 workerthreads (en der sender, en der modtager)
2 data-køer (en til inddata, en til uddata)
1 main thread der styrer det hele

Så bliver lærerne rigtig glade, det lover jeg dig.

Ved du forresten hvordan du laver en effektiv kø, der ikke bruger for mange ressourcer?
Avatar billede tax Nybegynder
07. december 2001 - 11:54 #10
Standard Template Library lister eller vektorer?
Avatar billede tax Nybegynder
07. december 2001 - 12:07 #11
Kan man iøvrigt bruge BSD sockets under MFC?
Avatar billede alvion Nybegynder
07. december 2001 - 12:15 #12
Jeg tror godt, at du kan lave BSD sockets under MFC.

Køen ville jeg implementere som et cyklisk array, dvs. et array med en fast størrelse, hvor du fylder data i den ene ende, og tager dem ud i den anden. Når der så ikke er plads til flere data i enden, så begynder du at fylde op fra starten igen (såfremt at der er plads).
Avatar billede tax Nybegynder
07. december 2001 - 12:16 #13
Ja en ringbuffer, ikke?
Avatar billede alvion Nybegynder
07. december 2001 - 12:23 #14
Nemmerlig :-)

STL har også en kø, men den er vist kun cyklisk, hvis du selv laver en cycklisk container...
Avatar billede tax Nybegynder
07. december 2001 - 12:26 #15
STL\'s liste kan du tage ud fra både top og bund, så det er let at bruge den som buffer. Jeg har bare ikke lige fundet ud af hvordan jeg sætter den op under MFC. Det må blive mandag. -Nu skal jeg ud og have mig et liv! :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester