首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Indy 9到Indy 10应用程序:连接被拒绝

Indy 9到Indy 10应用程序:连接被拒绝
EN

Stack Overflow用户
提问于 2022-02-09 19:53:10
回答 1查看 179关注 0票数 0

我正在用Indy 9移植旧的Delphi 2009应用程序到Delphi 11和Indy 10:

代码语言:javascript
复制
// *************** Indy Version 9:
IdTCPClient1.Host := '123.456.789.012';
IdTCPClient1.Port := 123;
IdTCPClient1.Connect;
IdTCPClient1.OpenWriteBuffer;
IdTCPClient1.Write(Data);
i :=  IdTCPClient1.ReadInteger(True);
x := IdTCPClient1.ReadLn('</root>', 20000, 1500);
// Works OK

// *************** Indy Version 10
XMLStream := TMemoryStream.Create;
XMLDoc1.XML.SaveToStream(XMLStream);
IdTCPClient1.Host := '123.456.789.012';
IdTCPClient1.Port := 123;
IdTCPClient1.Connect;
IdTCPClient1.Socket.Open;
IdTCPClient1.Socket.WriteBufferOpen;
IdTCPClient1.Socket.Write(XMLStream, XMLStream.Size);
i := IdTCPClient1.Socket.ReadInt32(True);
x := IdTCPClient1.Socket.ReadLn('</root>', 20000, 1500);
// Socket Error # 10061 Connection refused.

两个版本都在同一个PC/用户中执行.任何帮助都将不胜感激。弗朗西斯科

代码语言:javascript
复制
    //Still receiving Socket Error # 10061: Connection Refused
    IdTCPClient1.Host := '123.456.789.0';
    IdTCPClient1.Port := 55065;
    IdTCPClient1.Connect;
    IdTCPClient1.Socket.WriteBufferOpen;
    IdTCPClient1.Socket.Write(XMLStream, XMLStream.Size);
    i := IdTCPClient1.Socket.ReadInt32(True);
    sResp := IdTCPClient1.Socket.ReadLn('</root>', 20000, 1500);
    IdTCPClient1.Socket.WriteBufferFlush;
    IdTCPClient1.Socket.Close;
    IdTCPClient1.Disconnect;
    // I omitted some code like try, except
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-09 21:27:15

你对印地10号的翻译不完全正确。您根本不应该调用Socket.Open(),因为Connect()已经在内部处理这个问题,而Open()调用才是真正创建套接字和建立TCP连接的原因。所以,你试图打开第二个连接,这是行不通的。完全摆脱那个电话:

代码语言:javascript
复制
IdTCPClient1.Connect;
// IdTCPClient1.Socket.Open; // <-- get rid of this!

另外,在您的两个代码中,您都是在打开Indy的内部写缓冲区,但是您在哪里刷新/关闭它呢?只要缓冲区是打开的,您执行的任何写操作都只会将它们的字节存储在缓冲区中,而不是通过套接字传输它们(除非您分配了一个缓冲区阈值,而您的示例并非如此)。

代码语言:javascript
复制
// *************** Indy Version 9
IdTCPClient1.Connect;
IdTCPClient1.OpenWriteBuffer;
IdTCPClient1.Write(Data);
...
// where is the call to (Flush/Close/Cancel)WriteBuffer?
代码语言:javascript
复制
// *************** Indy Version 10
IdTCPClient1.Connect;
IdTCPClient1.Socket.WriteBufferOpen;
IdTCPClient1.Socket.Write(XMLStream, XMLStream.Size);
...
// where is the call to WriteBuffer(Flush/Close/Cancel)?

通常,您不需要使用Indy的写缓冲区,除非您发送了大量数据,并且将从缓冲可能提供的性能提升中获益。默认情况下,TCP已经在套接字本身的内部缓冲区中缓冲数据,因此通常不需要在此基础上使用Indy的写缓冲。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71055885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档