/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Winsock 2 sende problemer
Fra : Klaus Petersen


Dato : 06-05-02 03:12

Hej NG.

Jeg er i gang med at lave et winsock 2 objekt i Visual C++ 6.0, som også
virker fint langt henaf vejen.

- - - - -

Problemerne opstår, når jeg vil sende flere tekststrenge over en socket
hurtigt efter hinanden.

- - - - -

Jeg starter med at sende, når jeg efter forbindelsen er etableret, modtager
en FD_WRITE event (som man i følge
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/ovr
vw3_9xma.asp skal gøre).

- - - - -

"send" metoden på SOCKET/winsock2.h objektet (se evt.
http://msdn.microsoft.com/library/en-us/winsock/wsapiref_6quq.asp?frame=true
), som jeg bruger til at sende tekststregene med, returnerer success - men
modtageren får ikke fat i *alle* tekststrengene - kun ca. 2 af 6.

Problemet kan også opnåes i delphi med følgende kode:

procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
socket.SendText ('here is a string'+#0);
//sleep (150);
socket.SendText ('here is a string 2'+#0);
//sleep (150);
socket.SendText ('here is a string 3'+#0);
//sleep (150);
socket.SendText ('here is a string 4'+#0);
//sleep (150);
socket.SendText ('here is a string 5'+#0);
//sleep (150);
socket.SendText ('here is a string 6'+#0);
end;

.... ergo må det være måden, jeg gør det på, der er problemer med.

Sætter man en 'Sleep (dwMilisec)' ind mellem hver linje, virker koden fint i
C++, men ikke i delphi (det virker dog bedre med sleep i forhold til når den
ikke er der).

Kan nogen se problemet?

Sprøg endelig hvis der er noget, der er uklart.

mvh.
Klaus.



 
 
Martin Dyring (06-05-2002)
Kommentar
Fra : Martin Dyring


Dato : 06-05-02 07:12

"Klaus Petersen" <spektual@hotmail.com> wrote in message
news:ab4opd$5e0$1@sunsite.dk...
> Problemet kan også opnåes i delphi med følgende kode:
>
> procedure TForm1.ClientSocket1Write(Sender: TObject;
> Socket: TCustomWinSocket);
> begin
> socket.SendText ('here is a string'+#0);
[...]

Skal det forståes sådan at SendText kalder send()? -I så fald skal du sikre
at send() sender hele strengen. Funktionen returnerer det antal bytes der er
sendt, det er ikke nødvendigvis hele bufferen.

--
Mvh,
Martin Dyring





bop (06-05-2002)
Kommentar
Fra : bop


Dato : 06-05-02 22:02


"Klaus Petersen" <spektual@hotmail.com> wrote in message
news:ab4opd$5e0$1@sunsite.dk...
> Problemet kan også opnåes i delphi med følgende kode:
>
> procedure TForm1.ClientSocket1Write(Sender: TObject;
> Socket: TCustomWinSocket);
> begin
> socket.SendText ('here is a string'+#0);
> //sleep (150);
> socket.SendText ('here is a string 2'+#0);
> //sleep (150);
> socket.SendText ('here is a string 3'+#0);
> //sleep (150);
> socket.SendText ('here is a string 4'+#0);
> //sleep (150);
> socket.SendText ('here is a string 5'+#0);
> //sleep (150);
> socket.SendText ('here is a string 6'+#0);
> end;

Virker dette:

socket.SendText (
'here is a string'+#0+
'here is a string 2'+#0+
'here is a string 3'+#0+
'here is a string 4'+#0+
'here is a string 5'+#0+
'here is a string 6'+#0);

Det gætter jeg på det gør. Hvis det er en mulig løsning så opbyg din streng
før du kalder SendText. Delphi komponenten er ikke så fleksibel som man
kunne ønske. Ellers vent på en OnWrite efter _hver_ SendText. Det vil sige
efter SendText returneres og der fortsættes ved modtagelse af næste OnWrite.

Så er der jo også muligheden for at gøre din socket blokerende.

--
BopBop



Klaus Petersen (07-05-2002)
Kommentar
Fra : Klaus Petersen


Dato : 07-05-02 00:22

OnWrite sker ikke hver send. OnWrite sker kun efter en ny-etableret
forbindelse og når bufferne, efter at de har været fyldt op*, bliver
tilgænglige igen.

*når send returnerer fejlen WSAEWOULDBLOCK

"bop" <bop@bop.dk> wrote in message news:ab6r08$1cis$1@news.cybercity.dk...
>
> "Klaus Petersen" <spektual@hotmail.com> wrote in message
> news:ab4opd$5e0$1@sunsite.dk...
> > Problemet kan også opnåes i delphi med følgende kode:
> >
> > procedure TForm1.ClientSocket1Write(Sender: TObject;
> > Socket: TCustomWinSocket);
> > begin
> > socket.SendText ('here is a string'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 2'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 3'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 4'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 5'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 6'+#0);
> > end;
>
> Virker dette:
>
> socket.SendText (
> 'here is a string'+#0+
> 'here is a string 2'+#0+
> 'here is a string 3'+#0+
> 'here is a string 4'+#0+
> 'here is a string 5'+#0+
> 'here is a string 6'+#0);
>
> Det gætter jeg på det gør. Hvis det er en mulig løsning så opbyg din
streng
> før du kalder SendText. Delphi komponenten er ikke så fleksibel som man
> kunne ønske. Ellers vent på en OnWrite efter _hver_ SendText. Det vil sige
> efter SendText returneres og der fortsættes ved modtagelse af næste
OnWrite.
>
> Så er der jo også muligheden for at gøre din socket blokerende.
>
> --
> BopBop
>
>



bop (08-05-2002)
Kommentar
Fra : bop


Dato : 08-05-02 16:55


"Klaus Petersen" <spektual@hotmail.com> wrote in message
news:ab7367$4mu$1@sunsite.dk...
> OnWrite sker ikke hver send. OnWrite sker kun efter en ny-etableret
> forbindelse og når bufferne, efter at de har været fyldt op*, bliver
> tilgænglige igen.
>
> *når send returnerer fejlen WSAEWOULDBLOCK
>

Ok, godt set. Der er en property (ClientType) på TClientSocket hvor du
fortæller om den skal være blokerende, men det er nok ingen fordel for dig.
Beskrivelsen er i online-hjælp. Jeg har ikke rigtigt selv haft held med det,
men det ser ud som om du har fundet årsagen til problemet? Med TCP kan man
forvente at få bytes i den rigtige rækkefølge og man kan være sikker på at
de kommer alle sammen, uden transmissionsfejl, men man kan ikke stille så
store krav til hvornår de kommer. Det er iøvrigt ikke kun Windows der
opfører sig på den måde, det er ganske generelt.

--
Bop



Klaus Petersen (14-05-2002)
Kommentar
Fra : Klaus Petersen


Dato : 14-05-02 20:38

Jeg har fået løst problemet og det forholdte sig som een af de andre, som
svarede på min henvendelse, sagde nemlig, at tekststrengene blev korrekt
sendt, men ikke nødvendigvis blev modtaget pænt opdelt. For det var nemlig
dét, der spøgede her: tekststrengene var ved modtagelsen, blevet samlet til
2-3 portioner, hvilket mit modtager-program ikke kunne finde ud af. Men da
jeg streamede indkommende data ud i en fil, kunne jeg bekræfte, at der ingen
fejl var i sendingen.

WSAEWOULDBLOCK "twisten" mærkede jeg i praksis, da jeg i en test sendte 10 x
20 mb. over netværket - ved sending nr. 2, returnerede "send" nemlig
WSAEWOULDBLOCK, og endnu en WRITE event blev udløst. Så jeg fik den til at
vente på WRITE eventen, når "send" returnerede WASEWOULDBLOCK, for herefter
at forsøge med "send" igen, og alt kørte bare som det skulle

"bop" <bop@bop.dk> wrote in message news:abbhp7$13eg$1@news.cybercity.dk...
>
> "Klaus Petersen" <spektual@hotmail.com> wrote in message
> news:ab7367$4mu$1@sunsite.dk...
> > OnWrite sker ikke hver send. OnWrite sker kun efter en ny-etableret
> > forbindelse og når bufferne, efter at de har været fyldt op*, bliver
> > tilgænglige igen.
> >
> > *når send returnerer fejlen WSAEWOULDBLOCK
> >
>
> Ok, godt set. Der er en property (ClientType) på TClientSocket hvor du
> fortæller om den skal være blokerende, men det er nok ingen fordel for
dig.
> Beskrivelsen er i online-hjælp. Jeg har ikke rigtigt selv haft held med
det,
> men det ser ud som om du har fundet årsagen til problemet? Med TCP kan man
> forvente at få bytes i den rigtige rækkefølge og man kan være sikker på at
> de kommer alle sammen, uden transmissionsfejl, men man kan ikke stille så
> store krav til hvornår de kommer. Det er iøvrigt ikke kun Windows der
> opfører sig på den måde, det er ganske generelt.
>
> --
> Bop
>
>



Klaus Petersen (07-05-2002)
Kommentar
Fra : Klaus Petersen


Dato : 07-05-02 00:24

Så er der jo også muligheden for at gøre din socket blokerende. >> hvordan
gør jeg det?
hvad er forskellen (kort fortalt) på non-blocking og blocking sockets
egentlig?

"bop" <bop@bop.dk> wrote in message news:ab6r08$1cis$1@news.cybercity.dk...
>
> "Klaus Petersen" <spektual@hotmail.com> wrote in message
> news:ab4opd$5e0$1@sunsite.dk...
> > Problemet kan også opnåes i delphi med følgende kode:
> >
> > procedure TForm1.ClientSocket1Write(Sender: TObject;
> > Socket: TCustomWinSocket);
> > begin
> > socket.SendText ('here is a string'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 2'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 3'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 4'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 5'+#0);
> > //sleep (150);
> > socket.SendText ('here is a string 6'+#0);
> > end;
>
> Virker dette:
>
> socket.SendText (
> 'here is a string'+#0+
> 'here is a string 2'+#0+
> 'here is a string 3'+#0+
> 'here is a string 4'+#0+
> 'here is a string 5'+#0+
> 'here is a string 6'+#0);
>
> Det gætter jeg på det gør. Hvis det er en mulig løsning så opbyg din
streng
> før du kalder SendText. Delphi komponenten er ikke så fleksibel som man
> kunne ønske. Ellers vent på en OnWrite efter _hver_ SendText. Det vil sige
> efter SendText returneres og der fortsættes ved modtagelse af næste
OnWrite.
>
> Så er der jo også muligheden for at gøre din socket blokerende.
>
> --
> BopBop
>
>



bop (06-05-2002)
Kommentar
Fra : bop


Dato : 06-05-02 22:06


"Klaus Petersen" <spektual@hotmail.com> wrote in message
news:ab4opd$5e0$1@sunsite.dk...
> Problemerne opstår, når jeg vil sende flere tekststrenge over en socket
> hurtigt efter hinanden.

Du skal også være opmærksom på at du ikke nødvendigvis modtager pænt opdelt
bare fordi du kalder SendText flere gange.

--
BopBop




Klaus Petersen (07-05-2002)
Kommentar
Fra : Klaus Petersen


Dato : 07-05-02 00:19

hm - du siger noget der..... når jeg siger, at jeg ikke modtager alle
strenge, er det fordi de alle sammen bliver vist. men hvis nogle af
strengene bliver slået sammen i samme pakke (som så vidt jeg har forstået
bliver gjort i windows for at optimere gøre netværk hurtigere) er det da
muligt, at jeg rent faktisk modtager det hele, men kun den første streng
bliver vist.

"bop" <bop@bop.dk> wrote in message news:ab6r7r$1cpl$1@news.cybercity.dk...
>
> "Klaus Petersen" <spektual@hotmail.com> wrote in message
> news:ab4opd$5e0$1@sunsite.dk...
> > Problemerne opstår, når jeg vil sende flere tekststrenge over en socket
> > hurtigt efter hinanden.
>
> Du skal også være opmærksom på at du ikke nødvendigvis modtager pænt
opdelt
> bare fordi du kalder SendText flere gange.
>
> --
> BopBop
>
>
>



Lars Kringelbach (07-05-2002)
Kommentar
Fra : Lars Kringelbach


Dato : 07-05-02 09:42



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408514
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste