Toon posts:

[c] Inzicht tekort :(

Pagina: 1
Acties:

Verwijderd

Topicstarter
Op een gegeven moment heb ik dit onderstaande stukje source code (... = overig source wat niet van belang is)
code:
1
2
3
4
5
6
7
char buf[256];

......

nbytes = recv(i, buf, sizeof(buf), 0);

....

Als ik naar me socket-applicatie met telnet connect in linux dan gaat alles goed, echter met de windows telnet worden alle tekens stuk-voor-stuk gestuurd dus dit heb ik:
code:
1
2
3
4
5
6
7
Linux:
buf = Dit is een regel\r\n

Windows:
buf = D
en als ik een lusje zou maken dan krijg ik natuurlijk uiteindelijk
buf = \r\n

Dus ik zat er aan te denken om een lusje erom heen te bouwen totdat ie \r\n tegen komt en dan eruit te gaan maar dan zit ik natuurlijk ermee dat het in linux niet werkt iemand een idee?

Verwijderd

Topicstarter
Om het probleem even duidelijk te houden:
Ik heb een oplossing nodig om de input van een Windows Telnet Client op te vangen met recv zonder dat ik daarmee weer met de Linux Telnet Client in de knoei kom....

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Als je doorgaat tot \n (ipv \r\n) werkt het op zowel windows als linux lijkt me. Eventueel kun je vervolgens checken op \r om 'em eruit te knippen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

de truuc is gewoon lezen tot je een \r\n tegen komt, zoals je zelf al aangeeft. Dit geeft geen problemen met linux, aangezien je dan al een \r\n tegen komt in de eerste iteratie :)

PS. je kunt met ioctlsocket opvragen hoeveel bytes je kunt lezen met 1 call naar recv. Dit doe je zo:
code:
1
2
3
4
5
6
SOCKET s
u_long bytes;

...

ioctlsocket (s, FIONREAD, &bytes);

bytes bevat nu het aantal bytes dat je kunt lezen. Als je dat nou in een lusje doet, en je zet alle data achter elkaar in een buffer, dan werkt het prima in zowel linux als windows

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:13
De topic van je post had wel wat duidelijker gemogen.

De kern van je probleem zit 'm erin dat TCP alleen met gegevensstromen werkt (zoals dat ook met bestanden werkt) en niet met packets. Als je 20 bytes kan inlezen, betekent dat dus niet dat er 20 bytes tegelijkertijd zijn verzonden (dat kan net zo goed meer of minder zijn), maar alleen dat er 20 bytes beschikbaar zijn op dit moment.

Zoals gezegd is jou probleem vrij eenvoudig op te lossen, door te controleren of je al een newline hebt.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

sidenote: ik denk dat de linux client de buffer pas verstuurd als je op enter drukt (a la IRC zeg maar), terwijl de windows client de tekens verstuurd als je ze intoetst. Volgens mij is dat wel in te stellen (op beide clients)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 11-09 14:32
Op dinsdag 19 februari 2002 22:08 schreef OiSyN het volgende:
sidenote: ik denk dat de linux client de buffer pas verstuurd als je op enter drukt (a la IRC zeg maar), terwijl de windows client de tekens verstuurd als je ze intoetst. Volgens mij is dat wel in te stellen (op beide clients)
Yep, Linux (Unix volgens mij ook) werkt op 'line-mode' basis. Terwijl Windows-systemen op 'character-mode' basis werken.

"The fastest code, is the code that is never called."

Pagina: 1