FD_WRITE:表示你现在可以写数据了
FD_READ:表示现在有数据到了

解决方案 »

  1.   

    Sniper:
       你好!
       能否把你的EMAIL告诉我,我把源代码寄过来
      

  2.   

    不好啊!如果是个100M的文件的话可不可用了,你可用类似于ftp方式来传。
    怎么做吗?你可给我发个Email来,把你的出问题的代码给我。
      

  3.   

    harley:
         我可以把整个源程序都发给你吗?
      

  4.   

    发和收的代码如下:(希望高手救救小弟,这是我毕设的题目,做不出来就惨了)
    客户端:(发送文件)
    int signal=0;
    int namelength;
    int filelen=0;
    void CClientSocket::OnSend(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call the base class
       
    CFile file;
        CFileException e;
    if(!file.Open(strEditFile,CFile::modeRead,&e)){
            
         #ifdef _DEBUG
               afxDump<<"file couldn't be opened"<<e.m_cause<<"\n";
         #endif
    }
        if(signal==0)
    {
    FileName=file.GetFileName();
    namelength=FileName.GetLength();
        char lpbuflength[1];
    memset(lpbuflength,0,sizeof(lpbuflength));
    lpbuflength[0]=(char)namelength;
    Send(lpbuflength,1,0);
    signal++;
    AsyncSelect(FD_WRITE);
    return;
    }

    if(signal==1)
    {
    //int namelength=FileName.GetLength();
    int x=Send((LPCTSTR)FileName,namelength,0);
    if(x==SOCKET_ERROR)
    {
    AsyncSelect(FD_WRITE);
    //::Sleep(250);
    return;
    }
    signal++;
    AsyncSelect(FD_WRITE);
    return;
    }

    if(signal==2)
    {
    int length;
    BOOL flag;
    flag=TRUE;
        BOOL flagerror;
    flagerror=TRUE;
    while(flagerror){
    while(flag){
    file.Seek((long)filelen,CFile::begin);
    length=file.Read(lpbuf,1000);
        if(length==1000){
    int x=Send(lpbuf,length,0);
    if(x==SOCKET_ERROR){
    flagerror=FALSE;
    //::Sleep(500);
    AsyncSelect(FD_WRITE);
    return;
    }
    filelen=filelen+x;
    length=0;
    memset(lpbuf,0,sizeof(lpbuf));
    }
    else{
    int y=Send(lpbuf,length,0);
    if(y==SOCKET_ERROR){
                  flagerror=FALSE;
      //::Sleep(500);
      AsyncSelect(FD_WRITE);
      return;
    }
    filelen=filelen+y;
    length=0;
    memset(lpbuf,0,sizeof(lpbuf));
    flag=FALSE;
    AfxMessageBox("transmit finished!!");
    return;
    }
    }
    }
    }
    file.Close();
    CAsyncSocket::OnSend(nErrorCode);
    }
    服务端:(接收文件)
    int signal=0; 
     char* lpbuflength;
     char* lpbufname;
    void CMainFrame::OnUserReceive()
    {
    if(signal==0)
    {
    lpbuflength=new char[1];
    memset(lpbuflength,0,1);
    m_ConnectedSocket.Receive(lpbuflength,1,0);
    signal++;
    return;
    }

    if(signal==1) 
    {
    lpbufname=new char[256];
    memset(lpbufname,0,256);
    int x=m_ConnectedSocket.Receive(lpbufname,(int)lpbuflength[0],0);
        signal++;
    return;
    }
    if(signal==2)
    {
    strcat(FilePath,lpbufname);
        delete lpbuflength;
    delete lpbufname;
    CFileException e;
    CFile file;
    if(!file.Open(FilePath,CFile::modeCreate and CFile::modeWrite and CFile::modeNoTruncate,&e))
    {
            #ifdef _DEBUG
       afxDump<<"File Could Not Be Opened!"<<e.m_cause<<"\n";
            #endif
    } char lpbuf[1000];
    memset(lpbuf,0,sizeof(lpbuf));
    int length;
    BOOL flag2=TRUE;
        do{
    length=m_ConnectedSocket.Receive((void*lpbuf,1000,0);
    file.Write(lpbuf,length);

    if(length!=1000)
                flag2=FALSE;
    }
    while(flag2);
        file.Close();
    }
    }
      

  5.   

    用csocket做,先发文件名和长度,然后文件分快传送(如每次1KB),收方计数收取即可.
      

  6.   

    zhqzhang229:
       请问怎样把文件分块发送???在csocket中是用archive来发送文件块吗?????