我先发言吧:我用基于连接的TCP/IP协议作了一个比较完善的异步发送和接收文件的类,
就是速度比较慢,而且不太稳定。不知道MS在局域网中拷贝文件的时候使用的是什么方法,速度快呆了。

解决方案 »

  1.   

    当然是TCP/IP了,做实时监控都用它!
      

  2.   

    spx/ipx比tcp/ip快多了.
    怎么做MSDN里有例子.
    但TCP/IP也够快了,我做的发送接受文件的,速度跟MS的拷贝差不多啊.
      

  3.   

    TO fengfeng1_1(郁闷啊郁闷):
       你是怎么做的,速度如何?
      

  4.   

    局域网要速度快的话就用udp,自已校验。
      

  5.   

    UDP is a slimmer protocol: its protocol header is fixed at 8 bytes, whereas TCP's is 20 bytes at minimum and can be more. 
    UDP has no congestion control and no data coalescing. This eliminates the delays caused by the delayed ACK and Nagle algorithms. (This is also a disadvantage in many situations, of course.) 
    There is less code in the UDP section of the stack than the TCP section. This means that there is less latency between a packet arriving at the network card and being delivered to the application. 
      

  6.   

    文件小,我用tftp协议。文件大,就直接ftp协议了。
    tcp/ip,udp都可以。ipx也行,我用串口通过modem传诵文件都try过,速度还行啊
      

  7.   

    shesh(无所谓):把你的贴出来吧
      

  8.   

    我想UDP应该够了吧,
    QQ用的就是UDP,
    没见查多少阿
      

  9.   

    用TCP协议很快,流式服务一旦建立可以让你省去如交付失序等很多麻烦,我记得以前好象收集了一个在Windows下用TCP传文件的VC DEMO,需要请发信[email protected]
      

  10.   

    是IPX/SPX快,我玩KKND连网就选择的这个协议,6个人同时上一点都不耽误!
      

  11.   

    TCP方式发送,不要使用异步方式,且发送都要使用内存方式,不要边读文件,边发送!!!
      

  12.   

    哪位给个例子,再加100分,请各位给个例子:
    [email protected]
      

  13.   

    就是用TCP呀,文件传送嘛,比IPX好多了,想一下FTP就是用的是TCP嘛
      

  14.   

    IPX/SPX比TCP/IP要快,NetBEUI比IPX/SPX要快。
      

  15.   

        严格地说,这个论题并不合理。文件的传输情况不仅决定于协议,更决定于网络状况、协议栈顺序、编码方式等等。举一个例子,当年我们架设FTP时发现,2000下第三方FTP软件大多速度较慢,而2000本身的FTP却能快9倍以上,说明和编码密切相关。
        从编码上说,首先要考虑的是提高有效载荷率,也就是尽可能发送大的数据包。当然了,TCP是流式的,默认状态下会自动组合。但是如果从文件中一次读出的太少,程序本身的循环次数就大大增加,尤其还需要系统调用,效率将大大下降。所以首先应当考虑优化编码。另外从编程角度,则应该尽量提高代码运行速度,这里的技巧就不说了。这一块其实对性能影响最大。
        我建议你还使用TCP,因为协议本身虽有性能差别,但是通用和易用更为重要。况且差别没有那么大。UDP需要复杂的状态机,他的优点不在这里,传文件是它最大的弱点。
        另外需要澄清,FTP和TFTP都是应用层协议,与TCP/UDP不能并论。FTP使用的是TCP。
      

  16.   

    非常感谢EagleCK(),不知能否给个传文件的代码,谢谢
    [email protected]
      

  17.   

    FTP用的是UDP???????
    不知道Kronus(Kronus)从哪儿听来的
      

  18.   

    对不起,我记错了,TFTP是用UDP
      

  19.   

    我程序中的一段,摘下来的,其中有个包头数据结构 FILEDATAEX 
    typedef struct  tagFILEDATAEX
    {
    PACKETTYPE pt_type;
    UINT uLength;
    UINT uSum;
    UINT uPos;
    UINT uHandleLow;
    UINT uHandleHigh;
    OBJOPERATE op_type;
    REFRESHDATATYPE dt_type;
    char  szFileName[128];
    }FILEDATAEX,*LPFILEDATAEX;函数
    int  IsSocketReady(UINT sock)
    {
    fd_set writeFDs;
    timeval    timeout;
    timeout.tv_sec = 0;
    timeout.tv_usec = 10;
    while (TRUE)
    {
    FD_ZERO(&writeFDs);
    FD_SET(sock,&writeFDs);
    int   fdsSet = select(sock+1, NULL, &writeFDs, NULL, &timeout);
    FD_CLR(sock,&writeFDs);
    //timeout. Timer expired
    if (0 == fdsSet) continue;
    if (SOCKET_ERROR == fdsSet)
    {
    if (WSAEINVAL == GetLastError())
    continue;
    }
    return fdsSet;
    }
    }
    void CConViewDlg::sRefreshData(LPFILEDATAEX lpFileDataEx,CString csFileName)
    {
    if (FALSE == m_gbLogFlag || NULL == lpFileDataEx || TRUE == csFileName.IsEmpty())
    return;
    CFile file;
    if (0 == file.Open(csFileName,CFile::modeRead))
    {
    DWORD dwError=GetLastError();
    acutPrintf("\n%s文件打不开",csFileName);
    return;
    }
    int nFileLength=file.GetLength();
    int nRead=0,nSend=0,nLeft=nFileLength;
    //文件缓冲区
    HGLOBAL hBuf=GlobalAlloc(GHND,nFileLength);
    if (NULL == hBuf)
    MSGRETURN("分配缓冲区错误");
    PBYTE pbBuf=(PBYTE )GlobalLock(hBuf);
    if (NULL == pbBuf)
    {
    GlobalFree(hBuf);
    MSGRETURN("内存锁定错误");
    }
    nRead=file.ReadHuge((void *)pbBuf,nFileLength);
    file.Close();
    //2001/12/12 Modify by Julien
    const int nSizeOfDataSection=MAXSIZEBUF-sizeof(PACKETHEADER);
    int nSum=nFileLength/nSizeOfDataSection;
    //文件长度
    lpFileDataEx->uLength=htonl(nFileLength);
    //总共数据包数目
    lpFileDataEx->uSum=htonl(nFileLength%nSizeOfDataSection==0?nSum:nSum+1);
    //strcpy(FileDataEx.szGroup,CConViewDlg::m_gLoginData.szGroup);
    //strcpy(FileDataEx.szUserName,CConViewDlg::m_gLoginData.szUserName);
    CComSocket &pSock=CConViewDlg::m_gskCom;
    pSock.Send(lpFileDataEx,sizeof(FILEDATAEX));
    sSendFileData(nFileLength,pbBuf);
    GlobalUnlock(hBuf);
    GlobalFree(hBuf);
    }void CConViewDlg::sSendFileData(int nDataLength,LPBYTE pbBuf)
    {
    if (FALSE == m_gbLogFlag || nDataLength <= 0 || NULL == pbBuf)
    return;
    const int nSizeOfDataSection=MAXSIZEBUF-sizeof(PACKETHEADER);
    int nLength,nSum=0,nLeft=nDataLength,nSend;
    PACKETHEADER hdr;
    CComSocket &pSock=m_gskCom;
    char szBuf[MAXSIZEBUF];
    LPBYTE pbSend=pbBuf;
    //文件数据
    while(nLeft>0)
    {
    //发送新的数据
    nLength=min(nSizeOfDataSection,nLeft);
    hdr.pt_type=(PACKETTYPE)htonl(PT_DATA);
    hdr.uLength=htonl(nLength);
    hdr.uPos=htonl(UINT(pbSend-pbBuf));
    hdr.uSum=htonl(nSum);
    memcpy(szBuf,&hdr,sizeof(hdr));
    memcpy(szBuf+sizeof(hdr),pbSend,nLength);
    if (IsSocketReady(pSock.m_hSocket) < 0)
    MSGRETURN("网络错误");
    nSend=pSock.Send(szBuf,nLength+sizeof(hdr));
    if (SOCKET_ERROR==nSend)
    {
    if(WSAEWOULDBLOCK==GetLastError())
    {
    continue;
    }
    CString csMsg;
    csMsg.Format("已经发送了 %d 个字节时出错",pbSend-pbBuf);
    MSGRETURN(csMsg);
    }
    nSend-=sizeof(hdr);
    if (nSend <= 0)
    continue;
    pbSend+=nSend;
    nLeft-=nSend;
    nSum++;
    }
    //结束数据包
    hdr.pt_type=(PACKETTYPE)htonl(PT_END);
    hdr.uLength=htonl(0);
    hdr.uPos=htonl(0);
    hdr.uSum=htonl(nSum);
    int nRet;
    if ((nRet=IsSocketReady(pSock.m_hSocket)) < 0)
    MSGRETURN("网络错误");
    pSock.Send(&hdr,sizeof(hdr));
    }
      

  20.   

    TO diablon(波罗): 使用局域网拷贝,速度是很快。但是在网络状况不太好的时候,连对方的计算机都看不见,从而无法拷贝。
      

  21.   

    什么呀,我发现上面的帖子有好多有误。比如说FTP用的是TCP而不是UDP。还有要用SPX/IPX的话,你必须在对方的机器上安装了该协议,而我们的局域网有些用户没有安装该协议。微软用的是NETBIOS,好象是802。3的祯。我推荐最好用UDP做,因为在内网里,UDP比TCP简单,不用什么三次握手哟,当然要快了。
      

  22.   

    我不是用的网上邻居,我用的CSocket,传统意义上的那个Create,Listen
    Accept,和Connect,不过我用的端口是自定义的,能怎么算呢
      

  23.   

    其实如果是专业级别的话一定会选择FTP或者TFTP,至于原因嘛,高手一定知道!