问:IdTcpServer和IdTcpClient的缓冲区如何控制?多线程写入会造成缓冲区溢出或者丢失包吗?

proton 2006-06-08 11:24:20
我有多个线程同时调用一个IdTcpClient的writebuffer方法写数据,会不会造成缓冲区溢出?或者死锁,丢失包?

如果大量数据涌入我的IdTcpServer,我还没来得及读出,TCP是丢弃大过缓冲区的包吗?
...全文
841 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bxjgood66 2006-11-13
  • 打赏
  • 举报
回复
mark
无风飞尘 2006-09-02
  • 打赏
  • 举报
回复
注意我的是用Server发送,Client接收的
无风飞尘 2006-09-02
  • 打赏
  • 举报
回复
IdTcpServer和IdTcpClient的缓冲区如何控制?
发送:
repeat
try
FThread.Connection.OpenWriteBuffer;
BlockRead(GnFile, Buf, SizeOf(Buf), NumRead);
FThread.Connection.WriteBuffer(Buf,NumRead);
FThread.Connection.CloseWriteBuffer;
except
CloseFile(GnFile);
exit;
end;
until (NumRead = 0);

接收:
GnStream:=TFileStream.Create(FFileName,fmCreate);
GnStream.Size := FSize;
GnStream.Seek(0,soFromBeginning);
Client.ReadStream(GnStream,FSize);


多线程写入会造成缓冲区溢出或者丢失包吗?

不会丢包的,也不会溢出的,你不要看上面发送时是一个劲地在那里发,但其实不是的,如果接收端接到一半暂停下来,发送方也会停下来,IdTcpServer和IdTcpClient里面已经封装好了的功能,可以放心用.
iec 2006-07-26
  • 打赏
  • 举报
回复
可以把发送和接收缓冲区设置大一些.
多个线程肯定要同步.按TCP传输协议,它应该有流量和拥塞控制.
sfengnet 2006-07-24
  • 打赏
  • 举报
回复
IdTcpClient 在发送的时候是先将数据发送到系统缓存区,然后由系统向目的地发送数据包的,如果缓存区空间已满,你往里写数据的时候会提示错误的(程序中),而实际运行中你可以通过判断发送的返回值来确定当前的数据是否正常发送出去,如果发送失败,则暂停一会再发试试.

不知道楼主明白了没有
proton 2006-07-21
  • 打赏
  • 举报
回复
up
proton 2006-06-15
  • 打赏
  • 举报
回复
没人会吗?
proton 2006-06-09
  • 打赏
  • 举报
回复
Tcp不是保证数据的传输到达码? 也会丢包?
sfengnet 2006-06-08
  • 打赏
  • 举报
回复
如果是多个线程调用一个 IdTcpClient的writebuffer方法 ,建议你用 临界区,

class TSection
{
public:
CRITICAL_SECTION css;
TSection(){ InitializeCriticalSection( &css ); }
~TSection(){ DeleteCriticalSection( &css ); }
void Enter(){ EnterCriticalSection( &css ); }
void Leave(){ LeaveCriticalSection( &css ); }
};

数据包过多,而你不去读取的话是会丢失的,不过对方应该也发不出去了
tianshu888 2006-06-08
  • 打赏
  • 举报
回复
路过,帮你up

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧