Ik word er gek van. Ik heb een server draaien op een Linux machine ergens waarmee je dan via TCP/IP kan communiceren.
Als ik bijvoorbeeld 'SKILLS' stuur krijg ik als antwoord
als ik bijvoorbeeld '.' stuur krijg ik (omdat ie niet kent natuurlijk).
Ik heb nu een leuk Delphi Programma gemaakt waarmee je dan 'SKILLS' zou kunnen sturen en het ontvangen text ergens in een MEMO bijvoorbeeld zou kunnen zien.
Hiervoor heb ik een ClientSocket op de form gedropped maar hij wil niet echt. Versturen lukt, da's geen probleem. Ontvangen wil niet. Op de OnRead event reageert ie niet, dus ik dacht ik doe het wel in een functie. Zo bijvoorbeeld:
Hij leest het mooi in, maar nadat ie de '0' heeft ingelezen blijft ie hangen bij ReceiveBuf() en doet niks meer. Toen dacht ik omdat dat ding ctblocking is, ik TWinSocketStream moet gebruiken (staat in Help).
Bij readen heb ik dan
gedaan. Die doet het ook goed. Maar als ik voor de tweede keer een commando intyp, dan zit zijn antwoord (eerste regel, of als ik het per character inlees, het eerste character) al in de buffer voordat ik het lees, dus al voor FillChar want die reset het weer.
Ik snap er echt geen drol meer van.
Kan iemand me helpen? Als je het zelf wil proberen: pc301g.liacs.nl port 2096. Met telnet enzo doet ie het wel.
Edit. Die Sock.Read is dus van type
en heb ik aangemaakt met
. Ook een WaitData helpt niet
Als ik bijvoorbeeld 'SKILLS' stuur krijg ik als antwoord
code:
1
2
| OK 0 |
als ik bijvoorbeeld '.' stuur krijg ik (omdat ie niet kent natuurlijk).
code:
1
2
3
| ERR 2 Command not recognized |
Ik heb nu een leuk Delphi Programma gemaakt waarmee je dan 'SKILLS' zou kunnen sturen en het ontvangen text ergens in een MEMO bijvoorbeeld zou kunnen zien.
Hiervoor heb ik een ClientSocket op de form gedropped maar hij wil niet echt. Versturen lukt, da's geen probleem. Ontvangen wil niet. Op de OnRead event reageert ie niet, dus ik dacht ik doe het wel in een functie. Zo bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| with ClientSocket do
begin
Host := pc301g.liacs.nl;
ClientType := ctBlocking;
Port := 2096;
try
Open;
{send query}
s := 'SKILLS'+#13#10;
intReturnCode := Socket.SendBuf(Pointer(s)^, Length(s));
if intReturnCode > 0 then
begin
{receive the answer}
{ iterate until no more data }
while (intReturnCode > 0) do
begin
{ clear buffer before each iteration }
FillChar(szBuffer, SizeOf(szBuffer), 0);
{ try to receive some data }
intReturnCode := Socket.ReceiveBuf(szBuffer, SizeOf(szBuffer));
{ if received a some data, then add this data to the result string }
if intReturnCode > 0 then
FileOut.Write(szBuffer, intReturnCode);
end
end
else
MessageDlg('No answer from server', mtError, [mbOk], 0);
Close;
except
MessageDlg('No connection', mtError, [mbOk], 0);
end;
end; |
Hij leest het mooi in, maar nadat ie de '0' heeft ingelezen blijft ie hangen bij ReceiveBuf() en doet niks meer. Toen dacht ik omdat dat ding ctblocking is, ik TWinSocketStream moet gebruiken (staat in Help).
Bij readen heb ik dan
code:
1
| intReturnCode := Sock.Read(szBuffer, SizeOf(szBuffer)); |
gedaan. Die doet het ook goed. Maar als ik voor de tweede keer een commando intyp, dan zit zijn antwoord (eerste regel, of als ik het per character inlees, het eerste character) al in de buffer voordat ik het lees, dus al voor FillChar want die reset het weer.
Ik snap er echt geen drol meer van.
Kan iemand me helpen? Als je het zelf wil proberen: pc301g.liacs.nl port 2096. Met telnet enzo doet ie het wel.
Edit. Die Sock.Read is dus van type
code:
1
| Sock: TWinSocketStream |
en heb ik aangemaakt met
code:
1
| Sock := TWinSocketStream.Create(ClientSocket1.Socket, 1000); |
. Ook een WaitData helpt niet
Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge