当使用Send()发送消息包时,如何判断发送缓冲区里是否还有未发送的数据?(20分)

  • 主题发起人 主题发起人 qylin1
  • 开始时间 开始时间
Q

qylin1

Unregistered / Unconfirmed
GUEST, unregistred user!
服务端收到客户端发来的消息包后,要返回一个消息到客户端,但当有很多客户端同时在线发包时,服务端经常会出现:超出系统资源 的错误,我想,这可能是因为当缓冲区内的数据还未发送完时,又将新的文本放入缓冲区要求发送,因此造成缓冲区溢出(不确定)。

那么,请问当使用Send()发送消息包时,如何判断发送缓冲区里是否还有未发送的数据?

谢谢!!
 
用过控件,有发送完成事件的
 
以下可以检测除IO重叠以外的Socket, VCL好像是这样的,
我在我的程序中应用的非常正常 。
//检查Socket是否可写, 可写返回True,否则相反
function SocketInSend(const S: TSocket): BOOL;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
FD_ZERO(FDSet);
FD_SET(S, FDSet);
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 250;
Result := (select(0, nil, @FDSet, nil, @TimeVal) > 0);
end;
 
不可写就是缓冲区已满,或Socket有其他异常。
 
//我想,这可能是因为当缓冲区内的数据还未发送完时,又将新的文本放入缓冲区要求发
//送,因此造成缓冲区溢出(不确定)。

呵呵,系统不会出现这种情况的。滑动窗口会处理的,如果已经满了的话,是不会发出去的。
这个你可以检查返回值就明白了。
 
楼上的说法是正确的,你不需要判断发送缓冲区是否已满,你只要根据send的返回值就可以知道。
 
iRet:=Send();

if (iRet=SOCET_ERROR) and (WSAGetLastError=10035) then
begin
// 系统发送缓冲满了...
end;

偶的解决办法是:
1> 改用IOCP完成端口

2> 用个
repeat
// 在这里处理发送和判断缓冲,直到完全发送出去
until 发送完毕;
 
问题还未解决,算了,派分
 
你还是用控件吧,发送缓冲区还有多少个字都知道
 

Similar threads

后退
顶部