一个3MB左右的文件,用WHILE循环每次读出1024个字节,然后发送
服务器
while(文件尾)
{
   readfile(....)
   send(.....)
}客户端
case FD_READ
     recv(....)
     openfile(.....)
     write(...)
     closefile(....)每次收到传过来的1024个字节就写入磁盘。
但是文件一大就会出现问题
根据返回值知道是服务器端的SEND函数出问题。
是不是因为服务器端读文件就发送速度太快,而客户端要接受还要写入,速度太慢而产生的原因如果加大缓充区。比如一次读1MB字节到内存再发送,但是客户端只能收到8KB左右
我想知道send和recv函数的最大发送和接收字节。具体的发送过程和接收的机制象我这样写效率肯定不高,为什么一发大文件就会send失败

解决方案 »

  1.   

    在传输文件内容的数据前,
    象ftp那些,命令是有结束标志的,你可以学ftp协议那样,在传输前做些必要的协商,如交换一些文件信息,
    在接收这些信息时就一个一个字节读,读到结束符就停止,就不怕几个包粘到一块啦然后在确定要传输的文件大小和文件名等信息后,接收数据就可以大胆大胆的接收了,有数据来就写,
    好像windows的缓冲区满了会组塞,这边满了那边自然就发不过来
      

  2.   

    sorry,差点没注意到你用的是WSAAsyncSelect
    服务器
    while(文件尾)
    {
       readfile(....)
       send(.....)
    }既然是用WSAAsyncSelect,你就不应该这样写的吧,套接字要FD_WRITE 你才send,你这样在循环里一直send能行么?
      

  3.   

    楼上正解,在对方来不及处理数据的时候,可以把FD_WRITE注册到WSAAsyncSelect上,在套接字可写的时候才发送数据,要不然就用重叠结构来处理.
    其实你的接收端可以先分出一片较大的缓冲来暂存收到的文件块,到达规定尺寸后再一次写入文件