Avatar billede spectual Nybegynder
06. maj 2002 - 04:02 Der er 4 kommentarer og
1 løsning

Winsock 2 sende-problemer

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/ovrvw3_9xma.asp skal gøre).

"send" metoden på SOCKET/winsock2.h objektet, som jeg bruger til at sende tekststregene med, returnerer success - men serveren modtager ikke *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.

Kan nogen se problemet?

Sprøg endelig hvis der er noget, der er uklart.
Avatar billede spectual Nybegynder
06. maj 2002 - 04:04 #1
"..virker koden fint i C++, men ikke i delphi" >> skal lige tilføje at koden dog trods alt virker bedre *med* en sleep, end uden.
Avatar billede laffe Nybegynder
06. maj 2002 - 09:50 #2
Kopier alle strenge i en buffer, og send dem med:

SendBuf(....);
Avatar billede spectual Nybegynder
07. maj 2002 - 01:12 #3
der må da være en årsag til problemerne. dit forslag vil sandsynligvis virke, men det ville være at udsætte problemerne (da jeg på et tidspunkt senere i udviklingen skal lave en rutine, der sender filer).
Avatar billede laffe Nybegynder
07. maj 2002 - 11:29 #4
Jeg tror at socket ikke er færdig med at sende den første text, før du sender den anden afsted.

Hvilken socket fejl få du ?

Checker du, om du få sendt alle karakter?

SendText returnerer antal bytes sendt.
Avatar billede spectual Nybegynder
10. maj 2002 - 12:13 #5
Problemet lå ikke i sende-rutinen, men i modtager rutinen. Det var faktisk lidt dumt af mig! Jeg tænkte ikke over, at TCP protokolen er en stream protokol, og derfor ikke arbejder med pakker. Windows samler automatisk data, der skal sendes, i små portioner for at optimere netværksforbindelsen. Det betyder, at tekststrengene ikke nødvendigvis bliver modtaget pænt opdelt - men stuvet sammen - hvilket giver et problem, når man skal vise tekststrengene (showmessage viser _kun_ den teksten indtil den møder en 0 byte / terminating zero - den undersøger ikke om der kommer tekst _efter_ terminating zero). Jeg lavede mit server-test program om, så at den gemte alt data den modtog i en fil, og her kunne jeg så se, at den havde modtaget alle dataene.
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