用socket发送大文件的问题(20分)

  • 主题发起人 主题发起人 ucan1
  • 开始时间 开始时间
U

ucan1

Unregistered / Unconfirmed
GUEST, unregistred user!
ClientSocket1Connect事件写如下代码:

buffer:array[1..40960] of Char;

try
fStream:=TFileStream.Create('c:/b.doc',fmOpenRead);
actualRead:=fStream.Read(buffer,SizeOf(buffer));
k1:=clientsocket1.socket.SendBuf(buffer,SizeOf(buffer));

actualRead:=fStream.Read(buffer,SizeOf(buffer));
Label01:
k2:=clientsocket1.socket.SendBuf(buffer,actualRead); //***
if (k2=-1) then
goto Label01;
finally
fStream.Free;
end;

上面带***号的这个语句第一次发送时不一定成功,所以我加了一个判断语句,如果
发送未成功则继续发送;
虽然我post数据到服务器成功,但是发生错误:socket error :10053
错误的含义是说已建立的socket连接被主机上的软件终止;好像是连接超时。


现在我定义的buffer已经算大了(40K),况且我要post的文件不大(67K),只要2次sendbuf就可以了;但是第二次sendbuf就出现了问题。以后我要post的文件会更大,要执行的sendbuf就更多了,岂不是需要执行的goto次数更多的多,所需要等待消耗的时间也多多了,那就更应该会发生
已建立的socket连接被主机上的软件终止这种问题。我该怎么办呢?
才能使每一次sendbuf都能顺利的发送成功。
 
别折腾了,因为你使用了异步模式,所以在接收时总有些问题。
建议使用synapse函数库,很容易就可以回避这样问题哦
 
能够发送成功跟定义的缓冲区大小无关。主要是发送与接收的问题。
10053错误通常是连接方非正常退出引起的。
 
我不懂什么synapse函数库;
上面我是把buffer定义为buffer:array[1..40960] of Char;所以要两次sendbuf;
如果我把buffer定义为buffer:array[1..61440] of Char;这样一次sendbuf就可以发送
完毕所有的数据,测试时候也发送成功,也没有什么错误。
我就搞不懂为什么调用1次sendbuf就能顺利进行;调用2次sendbuf就不能顺利进行;
 
你好好看看教材,定义缓冲区的大小不能解决问题的
因为使用异步模式,所以在接受大文件时,第一次发送未完成,第二次发送就开始了,
这会导致接受异常。
如果使用同步模式,就没有这样的问题。
可以留下你的QQ,我现在在线。
 
你可以在以下地址找到Synapse TCP/IP Library v24
http://www.delphibyte.com/download/download.php
 
TO:keyb
那我是不是要采用阻塞模式?

My qq:86405112
 
现在我采用阻了塞模式;同样的还有这个错误
 
一问一答就可以解决这个问题,为提高效率,可以发送3-5个数据包应答一次!
 
有什么好办法可以解决这个错误问题呀?
(服务器端不编写程序)
 
我不太懂,不过写了一个很差的程序,可以传大文件
程序很长很差,要源码mail:bear@cnki.net
不好意思把源码贴在这里
 
多人接受答案了。
 
后退
顶部