如何正确地连续发送数据???(100分)

  • 主题发起人 主题发起人 logpie
  • 开始时间 开始时间
L

logpie

Unregistered / Unconfirmed
GUEST, unregistred user!
这是发送线程部分代码:
FRet:=WSASend(tmpSocket,@FWSABUF,1,byts,Flags,@FOverLap,nil);
BytesSent:=Byts;
if GlaEvent<>0 then
begin
if BytesSent=260 then SetEvent(GlaEvent); //260是我的一个数据包的大小
end; 如果数据发出去了就发信号
通知移动数据库记录位置


这是连续发送RECORD的程序段,GLAEVENT在FD_READ消息时CREATE:
frmMain.UserTable.Locate('User',FStr2,[]);
frmMain.URLTable.First;
for i:=0 to frmMain.URLTable.RecordCount -1 do
begin
newURL:=frmMain.URLTable.Fields[2].AsString;
oldURL:=frmMain.URLTable.Fields[1].AsString;
Pooler.RunActiveThreads(1,IP,ACPSocket,DataBuf,XX_DB_FILE_REAL,'','',overlap);
while true do
begin
WaitForSingleobject(GlaEvent,20); //这里如果该成INFINITE就只能发送第一条记录
frmMain.URLTable.Next;
ResetEvent(GlaEvent);
break;
end;
end;
Closehandle(GlaEvent);
end;

而接受数据时只能接受到第1条和第3条,其他的都接受不到,发送端用的EVENTSELECT,接受段用的完成端口
我想引起问题的可能是发送数据的速度赶不上记录移动的速度
所以用了EVENT来控制移动,稍微好了一点,能接受两条了,但就算我把20改成其他的等待时间,耶还是只能接受到这两条
不知该怎么样写....我不想用SQL... : )
 
关闭NAGLE算法也没用
 
是不是因为你发送得太快,系统的缓冲区容纳不下造成的?

PS:呵呵,对你的完成端口的例子很眼谗,能不能发一份给偶?我可以开一份300分的贴子给你(如果不够请说话,在我能力范围内我一定做到)。谢谢!
 
:) 2次都是ego大哥帮忙提,感谢

过几天给你写个简单的例子好啊,近来有点忙:(

我的mail:logpie@163.com
 
您太客气了。我给你发了E-Mail,如果例子写好了,请通知我一声。谢谢!
我的E-Mail: goofree@163.com
 
例子已发:)
 
后退
顶部