社区
网络及通讯开发
帖子详情
问:IdTcpServer和IdTcpClient的缓冲区如何控制?多线程写入会造成缓冲区溢出或者丢失包吗?
proton
2006-06-08 11:24:20
我有多个线程同时调用一个IdTcpClient的writebuffer方法写数据,会不会造成缓冲区溢出?或者死锁,丢失包?
如果大量数据涌入我的IdTcpServer,我还没来得及读出,TCP是丢弃大过缓冲区的包吗?
...全文
841
10
打赏
收藏
问:IdTcpServer和IdTcpClient的缓冲区如何控制?多线程写入会造成缓冲区溢出或者丢失包吗?
我有多个线程同时调用一个IdTcpClient的writebuffer方法写数据,会不会造成缓冲区溢出?或者死锁,丢失包? 如果大量数据涌入我的IdTcpServer,我还没来得及读出,TCP是丢弃大过缓冲区的包吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
INDY 10 的
id
TCPSERVER
和
id
TCPCLIENT
通讯的例子
INDY 10 的
id
TCPSERVER
和
id
TCPCLIENT
通讯的例子
Delphi 基于
Id
TcpServer
和
Id
TcpClient
通讯实例源码.rar
delphi 基于
Id
TcpServer
和
Id
TcpClient
的通讯实例,
包
括客户端和服务端, procedure TForm1.
Id
TCPServer
1Connect(AThread: T
Id
PeerThread); begin Memo1.Lines.Text:='来自主机' AThread.Connection.Socket.Binding.PeerIP '的连接请求已被接纳'; AThread.Connection.WriteLn('Ariel:欢迎连接本服务器,竭诚为您服务'); end; procedure TForm1.
Id
TCPServer
1Disconnect(AThread: T
Id
PeerThread); begin Memo1.Lines.Text:='来自主机' AThread.Connection.Socket.Binding.PeerIP '已断开连接'; StatusBar1.Panels[0].Text:='连接已断开'; end; procedure TForm1.
Id
TCPServer
1ListenException(AThread: T
Id
ListenerThread; AException: Exception); begin StatusBar1.Panels[1].Text:='正在连接.....'; end;
Id
TCPServer
和
Id
TCPClient
的使用(支持文件发送)
2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.需要更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用!
Delphi7 基于
Id
Tcpserver
和
Id
TcpClient
的通讯程序
Delphi7 基于
Id
Tcpserver
和
Id
TcpClient
的通讯程序
Delphi简单
ID
TCPsever和
ID
TCPclient
应用
在程序中,服务端与客户端相连接后,应用readln和writerln实现两个程序字符串的链接
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章