这个问题有人遇到过吗???(200分)

  • 主题发起人 主题发起人 kesa
  • 开始时间 开始时间
K

kesa

Unregistered / Unconfirmed
GUEST, unregistred user!
UDPServer: TIdUDPServer
自己测试一下,在Client还没有连接之前
先打开服务 UDPServer.Active :=true;,
关闭UDPServer.Active := false,
再打开 UDPServer.Active := false;

Client在连接时发送信息时会弹出
Socket Error #10054
错误!

 
10054的ERROR碰到过,不过那是在建立连接后的事情,以下是10054的帮助,我认为你的服务和客户端在使用UDP是不会碰到这个错误的,找找其他原因吧,毕竟这个错误是TCP的。
Question/Problem: Connection reset by peer.

Answer/Solution: A connection was forcibly closed by a peer. This normally results from a loss of the connection on the remote socket due to a timeout or a reboot.

User suggestions: Some network systems have commands to report statistics. In this case, it might be possible to check the count of TCP RST packets received, or ICMP Port Unreachable packets. See other suggestions under WSAECONNABORTED.
 
To qince
不要太想当然。
这是个很简单的例子,
你自己可以做一下测试,
可能是TIdUdpServer的bug
 
呵呵,是吗,正好装了INDY,我试试[:)]
 
刚刚测试了一下,没有你说的问题。
不过,如果服务器没开的花,客户端确实会出现10054错误,
现在正在进一步查看。
 
问题出在UDPClient.ReceiveString();上,他调用了GStack.CheckForSocketError(Result);,而CheckForSocketError检查有没有错误发生,因为没有读到数据,所以就出现了10054错误。
如果你用另也各端口发送返回数据就没问题了。毕竟UDP没有绝对的服务端和客户端。[:)]
 
你试一下
UdpServer.Active :=true;
UdpServer.Active :=false;
UdpServer.Active :=true;
我的TIdUdpServer版本8.0.25
 
刚刚试过了,代码如下,我的版本是9.0.1
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,
IdStack, IdSocketHandle;

type
TForm1 = class(TForm)
UDPServer: TIdUDPServer;
Button1: TButton;
Memo1: TMemo;
BufferSizeLabel: TLabel;
PortLabel: TLabel;
HostAddressLabel: TLabel;
HostNameLabel: TLabel;
procedure FormCreate(Sender: TObject);
procedure UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
HostNameLabel.Caption := UDPServer.LocalName;
HostAddressLabel.Caption := GStack.LocalAddress;
PortLabel.Caption := IntToStr(UDPServer.DefaultPort);
BufferSizeLabel.Caption := IntToStr(UDPServer.BufferSize);
UDPServer.Active := True;
end;

procedure TForm1.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: String;
begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
Memo1.Lines.Add('Received "' + DataStringStream.DataString + '" from ' +
ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
s := 'Replied from ' + UDPServer.LocalName + ' to "' +
DataStringStream.DataString + '"';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
finally
DataStringStream.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if UDPServer.Active then Caption := 'True' else Caption := 'False';
UDPServer.Active := not UDPServer.Active;
if UDPServer.Active then Caption := 'True' else Caption := 'False';
end;

end.
 
你也可以试试,不开服务端程序,只开客户端,发送后就会返回10054错误的
 
你先不要打开客户端UDPClient.UdpServer完成上述操作后,再打开UdpClient
 
我觉得UDP本身不会有回应信息,也不会分服务端和客户端控件。INDY封装UDP的时候封装了一个ReceiveString,本身就是用SOCKET的一个Bind,这是他的一个功能,如果你不用这个功能,当然就没有错误了。[:)]
 
要不你将UDPClient.ReceiveString();这句话屏蔽试试,应该就没问题了。
 
我用Demo测试就有问题,和你的差不多
 
》你先不要打开客户端UDPClient.UdpServer完成上述操作后,再打开UdpClient
试过了,没问题,真奇怪!
建议还是:将UDPClient.ReceiveString();这句话屏蔽试试,应该就没问题了。
 
这有什么用,客户端的信息没有发到服务器
 
是呀,本身UDP就不管数据是否到达了目的地,那是TCP的事情。
 
那不对,还是服务器除了问题
 
哈哈,原来是Indy控件的BUG,我升级到9.0.14没问题了![:(]
 
我说楼主的问题怎么会这么怪呢,原来 原来[:)]
 
后退
顶部