奇怪的问题,Socket高手请进!(100分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
写了一个构件,包含了一个ClientSocket组件,大致框架如下:
TMySocket = class(TComponent)
private
FSocket: TClientSocket;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

constructor TMySocket.Create(AOwner: TComponent);
begin
inherited;
if not (csDesigning in ComponentState) then
begin
FSocket := TClientSocket.Create(Self);
FSocket.ClientType := ctBlocking;
end;
end;

destructor TMySocket.Destroy;
begin
FreeAndNil(FSocket);
inherited;
end;

窗口调用的代码如下:
Conn := TMySocket.Create(nil);
Conn.Connect;
......
Conn.Disconnect;
Conn.Free; //??

窗口调用的代码在第一次使用的时候一切正常,但是如果再次调用,就会发生socket一直
连不上服务器的问题,偶调试了半天,把Conn.Free;这句注释掉,就一切正常了。
有人能解释原因吗?
 
这里说的问题与你说的问题无关,只是提提
Create用了 if not (csDesigning in ComponentState) then
那么Destroy也要,才对应,虽然Free 一个nil也不出错
 
不要free,只要nil就可以.
 
nil不能释放资源啊!

我重新整理了一下代码,各位可以调试一下:

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);
end;

TMySocket = class(TComponent)
private
FSocket: TClientSocket;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Connect;
procedure Disconnect;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TBlueSMTP }

procedure TMySocket.Connect;
begin
fsocket.Active := true;
end;

constructor TMySocket.Create(AOwner: TComponent);
begin
inherited;
fsocket:=tclientsocket.Create(self);
fsocket.ClientType := ctBlocking;
fsocket.Port := 80;
fsocket.Host := 'www.sina.com.cn';
end;

destructor TMySocket.Destroy;
begin
disconnect;
Fsocket.free;
inherited;
end;

procedure TMySocket.Disconnect;
begin
fsocket.Active := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a:Tmysocket;
begin
a:=Tmysocket.Create(nil);
a.Connect;
a.Free; //这句注释就OK,不注释就完蛋 :(
showmessage('1');
end;

end.
 
Conn.Disconnect;

Conn.Free; //??
之间处理一下消息 Application.ProcessMessages
等到 FSocket.Active 变false再free
 
改成
procedure TMySocket.Disconnect;
begin
fsocket.Active := false;
repeat
Application.ProcessMessages;
until fsocket.Active = false;
end;

仍然不起作用。
 
在每次连接socket的时候先调用“WSAStartup()”,断开时候调用“WSACleanup()”
[这两个函数的用法请查看help]
 
To 陈:

procedure TForm1.Button1Click(Sender: TObject);
var
b:tclientsocket;
wVersion: word;
Data: WSADATA;
begin
b:=tclientsocket.Create(self);
b.ClientType := ctBlocking;
b.Port := 80;
b.Host := 'www.sina.com.cn';
wVersion := 2;
WSAStartup(wVersion, Data);
b.Active := true;
b.Active := false;
WSACleanup;
b.Free;
showmessage('1');
end;


还是不行哦 :(
 
下面的代码在我这里运行完全没问题哦(win2000/delphi5 update pack 1)
检查一下你的系统了:

var
b:tclientsocket;
begin
b:=tclientsocket.Create(self);
b.ClientType := ctBlocking;
b.Port := 80;
b.Host := 'www.163.net';
b.Active := true;
showmessage(inttostr(integer(b.Active)));
b.Active := false;
b.Free;
end;
 
是啊,我把编译通过的程序给别人运行却是正常的,难道我的系统有问题? 但所有的网络
应用都是正常的啊。

郁闷了,新年不顺。
 
可能是你的WINSOCK。DLL有点问题把
 
终于搞定了,发分庆祝。
 
后退
顶部