[Delphi]Socket niet 2 keer connecten?

Pagina: 1
Acties:

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Ik ben (nog steeds) bezig met een eigen MSN client maar ben (Alweer) tegen een probleem aangelopen. Alles gaat perfect, ik maak verbinding met de 1e server die mij het IP geeft van de volgende server en hiermee begint het probleem.

Ik maak de TClientSocket inactive:
code:
1
  csMSN.Close;

Ik wacht netjes tot ie goed dicht is:
code:
1
2
3
4
5
  while csMSN.Active do
  begin
    csMSN.Close;
    Application.ProcessMessages;
  end;

En stel het nieuwe IP en port in:
code:
1
2
3
4
  csMSN.Address := aAddress;
  csMSN.Host    := aHost;
  csMSN.Port    := aPort;
  csMSN.Open;


Vervolgens verwacht je natuurlijk dat de socket de nieuwe verbinding opent maar helaas, hij doet NIETS, ik krijg zelfs geen disconnect of error.
Als ik vervolgens EXACT dezelfde procedure start via een button werkt het als een trein :?

Iemand die dit kent?Ik begin me er nogal aan te irriteren want de oplossing kan toch nooit moeilijk zijn?Wat doe ik fout?

Eigenaar van domoticavergelijken.info


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

MidnightMotion schreef op 17 maart 2003 @ 21:27:
Ik maak de TClientSocket inactive:
code:
1
  csMSN.Close;

Ik wacht netjes tot ie goed dicht is:
code:
1
2
3
4
5
  while csMSN.Active do
  begin
    csMSN.Close;
    Application.ProcessMessages;
  end;
Netjes? Spamclosen vind jij netjes? :?

Volgens de documentatie van mijn versie van TClientSocket is de socket dicht zodra je Close aanroept. Zou je kunnen proberen :P

Professionele website nodig?


Verwijderd

okay, je gebruikt een loop omdat je van asynchrone sockets gebruik maakt, maar
het zou voldoende moeten zijn om de socket één maal te sluiten. Ik zou toch eens
kijken naar synchrone socket implementaties...

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
curry684 schreef op 17 March 2003 @ 21:30:
[...]

Netjes? Spamclosen vind jij netjes? :?
Hehe, ik heb intussen ALLES geprobeert om maar zeker te weten dat het ding dicht is en dit was nog de beste manier (je wil de rest van de wanhopige pogingen niet zien:)) Zonder deze code werkt het dus ook niet!

Eigenaar van domoticavergelijken.info


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Verwijderd schreef op 17 March 2003 @ 21:31:
okay, je gebruikt een loop omdat je van asynchrone sockets gebruik maakt, maar
het zou voldoende moeten zijn om de socket één maal te sluiten. Ik zou toch eens
kijken naar synchrone socket implementaties...
Daar heb ik eigenlijk weinig zin in (Code verbouwen etc), het moet op deze manier ook te doen zijn want met een druk op een 2e knop werkt het wel!

Eigenaar van domoticavergelijken.info


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
omdat je met asynchrone sockets werkt krijg je via events informatie over de state van je socket. Dus Open zal niet gelijk de socket openen maar doet dit in de achtergrond. Je krijgt via een event te 'horen' of het openen gelukt danwel niet gelukt is. Een loop met Application.ProcessMessages is eigenlijk niet zoals het hoort en kan zorgen voor vage problemen. Zorg er dus eerst voor dat je op een goede manier met de events omgaat en kijk of je probleem er dan nog steeds is.

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
TijnFLiP schreef op 17 March 2003 @ 21:45:
omdat je met asynchrone sockets werkt krijg je via events informatie over de state van je socket. Dus Open zal niet gelijk de socket openen maar doet dit in de achtergrond. Je krijgt via een event te 'horen' of het openen gelukt danwel niet gelukt is. Een loop met Application.ProcessMessages is eigenlijk niet zoals het hoort en kan zorgen voor vage problemen. Zorg er dus eerst voor dat je op een goede manier met de events omgaat en kijk of je probleem er dan nog steeds is.
Jij je zin :)

Ik maak intussen het ClientSocket component runtime aan en ruim het eerst op alvorens een nieuwe TClientSocket aan te maken. Instellingen, Open, hij komt nog door het OnConnecting event en BOEM, API 10038 error...

EDIT: WSAENOTSOCK ENOTSOCK 10038

[ Voor 4% gewijzigd door MidnightMotion op 17-03-2003 21:56 ]

Eigenaar van domoticavergelijken.info


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Never mind, problem solved! Of eigenlijk: omzeild.... (En daar houd ik eigenlijk niet van)

Ik heb dus alles runtime aangemaakt en ipv gewoon "Destroy" -> "DestroyComponents" aangeroepen, bingo!

Zou het kunnen dat TCLientSocket zijn eigen Socket niet eens netjes closed en opruimt?

Eigenaar van domoticavergelijken.info


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Ik weet vrijwel niks van Delphi maar in winsock is het iig zo dat je een socket niet kan hergebruiken. PSDK over shutdown:
An application should not rely on being able to reuse a socket after it has been shut down. In particular, a Windows Sockets provider is not required to support the use of connect on a socket that has been shut down.

www.madwizard.org


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Mijn bevinding:
TDCOMConnection can be opened asynchronously more than once without problems, but TSocketConnection and TWebConnection will produce an exception when opened a second time.
Zie dit topic voor meer info.

Een goede grap mag vrienden kosten.


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
De volgende code laat zien dat je wel degelijk meerdere keren kan connecten disconnecten met dezelfde socket (let op het is een proof of concept!!). Event based sockets is in zekere zin lastiger dan blocking sockets omdat je beter moet letten op je control flow. Ik zou dus zelf eerder blocking sockets gebruiken.

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }

    S : TClientSocket;

    procedure DoSockConnect(var Message: TMessage); message WM_USER;
    procedure DoSockClose(var Message: TMessage); message WM_USER + 1;

  protected
    procedure OnConnect( Sender: TObject; Socket: TCustomWinSocket );
    procedure OnDisconnect( Sender: TObject; Socket: TCustomWinSocket );
    procedure OnError(Sender: TObject; Socket: TCustomWinSocket;
       ErrorEvent: TErrorEvent; var ErrorCode: Integer);

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  S := TClientSocket.Create( Self );
  S.Port := 80;
  S.Host := 'www.google.com';
  S.OnConnect := OnConnect;
  S.OnDisconnect := OnDisconnect;
  S.OnError := OnError;
  S.Open;
end;

procedure TForm1.OnConnect( Sender: TObject; Socket: TCustomWinSocket );
begin
  // close the socket
  PostMessage( Self.Handle, WM_USER + 1, 0, 0 );
end;

procedure TForm1.OnDisconnect( Sender: TObject; Socket: TCustomWinSocket );
begin
  // open the socket
  PostMessage( Self.Handle, WM_USER, 0, 0 );
  // S.Open werkt hier niet omdat op dit moment de socket nog connected is
  // nadat de disconnect event is afgehandeld is ie pas disconnected. Ik Gebruik
  // daarom een PostMessage om de connect te doen
end;


procedure TForm1.OnError(Sender: TObject; Socket: TCustomWinSocket;
       ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
end;

procedure TForm1.DoSockClose(var Message: TMessage);
begin
  S.Close;
end;

procedure TForm1.DoSockConnect(var Message: TMessage);
begin
  S.Open;
end;

end.

[ Voor 9% gewijzigd door martijn_brinkers op 17-03-2003 23:31 ]

Pagina: 1