首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Indy 10以1024块发送数据。如何增加块的大小?

问Indy 10以1024块发送数据。如何增加块的大小?
EN

Stack Overflow用户
提问于 2015-10-07 17:43:30
回答 1查看 735关注 0票数 1

我同时开发了两个软件。

一个是iOS设备的TCP,它是用XCode开发的,另一个是Linux的TCP,它是在Lazarus开发的,使用Indy 10作为网络框架。

我可以在服务器和客户端之间发送数据,没有什么大问题,但是从服务器到客户端的数据传输速度对我来说是个问题。

当从iOS客户机向Linux服务器发送数据时,传输速度非常好,每秒可达20 MB,但从iOS服务器向iOS客户端发送数据时,每秒只能获得100 MB的传输速度。

Indy 10以1024字节块发送数据,我可以在我的iOS应用程序中通过使用NSLog()看到这一点。

问题:如何改变Indy 10的行为,同时发送更大的块?

编辑:--我正在使用以下代码发送TMemoryStream

代码语言:javascript
复制
procedure TMyClass.SendData(aData: TMemoryStream);
  var i: integer;
      ctx : TIdContext;
begin
  aData.Position := 0;
  with fIdTCP.Contexts.LockList do
  begin
    for i := 0 to Count -1 do //I'm broadcasting the data
    begin
      ctx := TIdContext(Items[i]);
      ctx.Connection.IOHandler.LargeStream:=true;
      ctx.Connection.IOHandler.Write(aData, aData.Size, false);
    end;

    ctx.Connection.IOHandler.WriteBufferClose;
    fIdTCP.Contexts.UnlockList;
  end   
end;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-07 19:42:19

Indy并不限制发送的数据包的大小。它的默认缓冲区大小是32K (请参阅TIdIOHandler.SendBufferSize属性),当读取TMemoryStream时(读取时仅受可用内存的限制),然后传递到底层套接字发送的字节数。

Linux可能会限制发送的大小。基础套接字的默认发送缓冲区大小可以是1024字节。Linux文档声明如下:

socket - Linux套接字接口

套接字选项 下面列出的套接字选项可以通过使用setsockopt(2)进行设置,并使用getsockopt(2)读取,而套接字级别设置为所有套接字的SOL_SOCKET。除非另有说明,optval是指向int的指针。 ..。 SO_SNDBUF 设置或获取最大套接字发送缓冲区(以字节为单位)。当使用setsockopt(2)设置该值时,内核会将其加倍(以允许簿记开销空间),这个加倍值由getsockopt(2)返回。默认值由/proc/sys/net/core/wmem_default文件设置,最大允许值由/proc/sys/net/core/wmem_max文件设置。此选项的最小(加倍)值为2048。

因此,请检查您的Linux的wmem_default/wmem_max配置是否将传输的数据包限制在1024字节以内。

您可以使用Indy的TIdSocketHandle.SetSockOpt()方法来尝试指定不同的缓冲区大小(在Linux配置的限制范围内),例如:

代码语言:javascript
复制
uses
  ..., IdStackConsts;

procedure TMyForm.MyTCPServerConnect(AContext: TIdContext);
var
  BufferSize: Integer;
begin
  BufferSize := ...;
  AContext.Binding.SetSockOpt(Id_SOL_SOCKET, Id_SO_SNDBUF, BufferSize);
  AContext.Binding.GetSockOpt(Id_SOL_SOCKET, Id_SO_SNDBUF, BufferSize);
  // BufferSize now contains the ACTUAL buffer size used by the socket
  // which may be different than what you requested...
end;

如果缓冲区大小没有受到Linux的限制,那么在接收数据时很可能会受到iOS的限制。确保您的iOS应用程序在读取stream事件处理程序中的NSInputStream时,不会将其输入缓冲区限制为1024字节。

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

https://stackoverflow.com/questions/32999006

复制
相关文章

相似问题

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