我有4个问题,向高手讨教!(200分)

  • 主题发起人 主题发起人 floatingsea
  • 开始时间 开始时间
F

floatingsea

Unregistered / Unconfirmed
GUEST, unregistred user!
1、win98se(client) 连接 win98(server)时,当client断开,出现"External exception 80000003"

2、Win NT 4(sp6)连接win98(server)时 ,winnt不能够连接server。

3、win95(client)连接win98(server)时,出现"Windows socket error: (10049),on API 'connect'",不能够联通,反过来可以联通.

4、当客户端(win98)断开时出现:服务端(win95)出现"Access violation at address 0044391e in module 'project1.exe'。Read of address ffffffff"

5、当客户端(win98)断开时出现:服务端(win98se)出现"Access violation at address 010c7fff 。Read of address 0108000"

程序在win98下用Delphi4开发!

我发现Delphi4下的chat例子也不能正常运行!
 
socket 的通信不可以法信息过于频繁.
你实施每个通信之间认为延迟一段时间.
半秒就差不多了.
 
>> 1、win98se(client) 连接 win98(server)时,当client断开,出现"External exception 80000003"
似乎是Debug版或是哪儿调了一下int 3指令造成的

>> 2、Win NT 4(sp6)连接win98(server)时 ,winnt不能够连接server。
一般来说不可能,看看是不是TCP/IP连接, 98的IP地址是不是能够Ping到

>> 3、win95(client)连接win98(server)时,出现"Windows socket error: (10049),on API 'connect'",不能够联通,反过来可以联通.
对的, 因为95是winsock 1.1, 而Delphi的那个是要Winsock 2支持的
可以装一个95下的patch来解决, microsoft上有down的, 或者装97 osr 2

>> 4、当客户端(win98)断开时出现:服务端(win95)出现"Access violation at address 0044391e in module 'project1.exe'。Read of address ffffffff"
你是不是,没判断socket的状态就去读写数据啦? 每次读只前要判断一下状态的.
此外, 还可以设置ondisconnect等事件, 或者客户端/服务端断开连接前等待
一会儿, 让对方有足够的时间收完数据.

>> 5、当客户端(win98)断开时出现:服务端(win98se)出现"Access violation at address 010c7fff 。Read of address 0108000"
与4是同样道理. 区别在于winsock是否将TCP/IP的收发窗口distroy掉.

总结: 好好学习TCP/IP socket编程, 看上去你的程序还缺乏足够的可靠性. ^_^
TCP/IP socket编程中有许多概念是与普通编程不太一样的.
 


>>> 2、Win NT 4(sp6)连接win98(server)时 ,winnt不能够连接server。
>一般来说不可能,看看是不是TCP/IP连接, 98的IP地址是不是能够Ping到

绝对能够ping得到win98的机器!
>
>>> 3、win95(client)连接win98(server)时,出现"Windows socket error: (10049),on API 'connect'",不能够联通,反过来可以联通.
>对的, 因为95是winsock 1.1, 而Delphi的那个是要Winsock 2支持的
>可以装一个95下的patch来解决, microsoft上有down的, 或者装97 osr 2

我已经安装了osr2了!
>
>>> 4、当客户端(win98)断开时出现:服务端(win95)出现"Access violation at address 0044391e in module 'project1.exe'。Read of address ffffffff"
>你是不是,没判断socket的状态就去读写数据啦? 每次读只前要判断一下状态的.
>此外, 还可以设置ondisconnect等事件, 或者客户端/服务端断开连接前等待
>一会儿, 让对方有足够的时间收完数据.
你能不能给个例子!!!!
>
>>> 5、当客户端(win98)断开时出现:服务端(win98se)出现"Access violation at address 010c7fff 。Read of address 0108000"
>与4是同样道理. 区别在于winsock是否将TCP/IP的收发窗口distroy掉.
>
>总结: 好好学习TCP/IP socket编程, 看上去你的程序还缺乏足够的可靠性. ^_^
>TCP/IP socket编程中有许多概念是与普通编程不太一样的.
>-----------------------------------------------------------------------------
我想要一个例子,但是很可靠,能不能给呢?
就是A可以发文件到B机,A机断开没有任何问题!OK
我是现炒现买,急用!
我原来的程序代码如下:


procedure TForm1.FormCreate(Sender: TObject);
begin
NickName:='我的昵称';
b_Client:=true;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ClientSocket1.close;
ServerSocket1.open;
StatusBar1.SimpleText:='开始监听';
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var s:string;
begin

if Clientsocket1.Active then

ClientSocket1.close;

if InputQuery('连接到计算机','要连接的计算机名称或IP地址:',s) then

if Length(s)>0 then

with ClientSocket1 do

begin

Host:=s;

open;

end;

end;


procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
b_Client:=true;

StatusBar1.SimpleText:='连接成功';


end;

procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
b_Client:=false;
StatusBar1.SimpleText:='连接到'+Socket.RemoteAddress;

end;

procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText:='等待来自'+Socket.RemoteAddress+'的连接允许响应...';
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_Return then

begin

Memo1.Lines.Add(NickName+':'+Edit1.Text);

if b_Client then

ClientSocket1.Socket.SendText(Memo1.Lines[Memo1.lines.Count-1])

else

ServerSocket1.Socket.Connections[0].SendText(Memo1.Lines[Memo1.lines.Count-1]);

end;


对了顺便问一个问题:
在用这个函数RasEditPhonebookEntry时老是出问题,说handle 不对,不知道是怎么回是!

implementation
//function RasCreatePhonebookEntryA :DWORD ; external 'Rasapi32.dll';
//function RasEditPhonebookEntryA :DWORD ; external 'Rasapi32.dll';
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
dwResult:DWORD;
strDialName : string;
begin
//在当前窗口中新建拨号连接

{ dwResult:=RasCreatePhonebookEntryA(handle,'');
if dwResult = 0 then
memo1.lines.add('新建拨号连接成功!')
else
begin
memo1.lines.add('新建拨号连接失败!');
Application.Terminate;
end;

strDialName :='163'; //拨号连接的名称设为163
//在当前窗口中指定修改拨号连接的属性
dwResult:=RasEditPhonebookEntry(Handle,'',PChar(strDialName));
if dwResult = 0 then
memo1.lines.add('修改拨号连接'+strDialName + '成功!')
else
memo1.lines.add('修改拨号连接' + strDialName + '失败!');

strDialName:='163'; //拨号连接的名称设为163
memo1.lines.add( '******************用拨号连接'+ strDialName+'实现拨号上网****************');}
strDialName:='169ess';
winexec(PChar('rundll32.exe rnaui.dll,RnaDial '+strDialName),2);

end;
 
提问者:
如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
请认真阅读大富翁论坛规则说明

http://www.delphibbs.com/delphibbs/rules.asp
 
接受答案了.
 
后退
顶部