类似QQ的局域聊天工具,采用C/S模式,我想实现类似QQ文件传送功能,不过是局域网的,现在我可是做毕业设计呀!请VC网络高手不惜赐教,谢了!

解决方案 »

  1.   

    晕,www.codeproject.com是英文网站!
      

  2.   

    But it is English Web!
    Please help me!!!
      

  3.   

    就用send(),recv()啊,TCP协议吧。
      

  4.   

    这个我作的很不错了,
    讲讲思路吧。
    serve  多线程 .....accept       接受.....
    client             连接,       发送.....
    就可以了。
      

  5.   

    发送:
    #include "afxmt.h"
    CString m_PATH;
    DWORD filesize;
    HWND hwnd_p;
    int IsBegin;
    void CNetSendDlg::OnTransfer(CString m_PATH)
    {}UINT CNetSendDlg::ThreadA(LPVOID pParam)
    {
    IsBegin=0;
    CFile myFile;
    if(!myFile.Open(m_PATH, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone))
    {
    return 0;
    } CString szIP;
    struct sockaddr_in sin;
    WSADATA wsaData;    
    SOCKET sockSrvr,sockRecv;
    char *IpAddr;
    if(WSAStartup(0x0101, &wsaData ))
    {
    AfxMessageBox("初始化 TCP/IP 协议栈发生错误!");
    return 0;
    }
    if(wsaData.wVersion != 0x0101)
    {
    AfxMessageBox("Winsock version is incorrect!");
    WSACleanup();
    return 0;
    }

    if ((sockSrvr = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
    {
    AfxMessageBox("Create socket error!");
    return 0;
    } if ((sockRecv = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
    {
    AfxMessageBox("Create socket error!");
    return 0;
    }
    //////////////////////////////////////
      CString m_addr;
      CString m_strT;
      CString sNetBiosName;
      char hostname[128];
      struct hostent *phost;
      gethostname(hostname,128);
      m_addr = hostname;
      phost = gethostbyname(hostname);
      int m_iCounter=0;
      for(int j = 0;j<4;j++)
      {
      
      m_strT.Format("%u", (unsigned int)((unsigned char*)phost->h_addr_list[0])[j]);
      sNetBiosName+=m_strT;
      if(m_iCounter<3)
      {
      m_iCounter++;
      sNetBiosName+=".";
      }  
      }
    //////////////////////////////////////
    szIP=sNetBiosName;
    IpAddr=szIP.GetBuffer(szIP.GetLength());
        sin.sin_family=AF_INET;
    sin.sin_addr.s_addr=inet_addr(IpAddr);
    sin.sin_port=htons(800);
    if(bind(sockSrvr,(sockaddr*)&sin,sizeof(sin))<0)
    {
    AfxMessageBox("绑定错误");
    return 0;
    }
    listen(sockSrvr,20);
    int length=sizeof(sin);
    sockRecv=accept(sockSrvr,(struct sockaddr*)&sin,&length);

    int timeout=300; 
    int status=setsockopt(sockRecv,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
    if(status)
    {
    AfxMessageBox("设置超时错误");
    WSACleanup();
    return 0;
    }
    int buf=10240;
        int status2=setsockopt(sockRecv,SOL_SOCKET,SO_RCVBUF,(char*)&buf,sizeof(int));
    if(status2)
    {
    AfxMessageBox("设置缓冲区大小错误");
    WSACleanup();
    return 0;
    }
    //////////////////////////////////////////////////////////////////
    WIN32_FIND_DATA             FindFileData;
    FindClose(FindFirstFile(m_PATH,&FindFileData));
       send(sockRecv,(char*)&FindFileData,sizeof(WIN32_FIND_DATA),0);
    ////////////////////////////////////////////////////////
    //PROGRESS
        filesize=(short)FindFileData.nFileSizeLow; 
    ::PostMessage(hwnd_p,WM_USER_PROG,NULL,NULL);
    ////////////////////////////////////////////////////
    UINT dwRead=0;
    byte* data;
    while(dwRead<FindFileData.nFileSizeLow)
    {
    data = new byte[2048];
    UINT dw=myFile.Read(data, 2048);
    send(sockRecv,(char*)data,2048,0);
    dwRead+=dw;
    delete [] data;
    IsBegin=1;
    ::PostMessage(hwnd_p,WM_USER_PROG,NULL,NULL);
    }
    IsBegin=2;
    //::PostMessage(hwnd_p,WM_USER_PROG,NULL,NULL); myFile.Close();
    closesocket(sockRecv);
    closesocket(sockSrvr);
    WSACleanup(); return 0;
    }LRESULT CNetSendDlg::OnProgress(WPARAM wParam, LPARAM lParam)
    {
    CString st;
    st.Format("%d",filesize); if(IsBegin==0)
    {
    m_Progress.SetRange(0,(short)filesize/1000); 
    m_Progress.SetPos(0);
    m_Progress.SetStep(1);
    }
    else if(IsBegin==1)
    {
    m_Progress.StepIt();
    }
    else if(IsBegin==2)
    {
    m_Progress.SetPos((short)filesize/1000);
    } return 0;}static char BASED_CODE szFilter[]="|*.*|";
    void CNetSendDlg::OnButton1() 
    {
    OPENFILENAME ofn ;
    TCHAR  szFullName[_MAX_PATH];
    ::ZeroMemory (&ofn, sizeof(OPENFILENAME)) ;
    szFullName[0] = TEXT('\0') ;
    ofn.lStructSize       = sizeof (OPENFILENAME) ;
        ofn.hwndOwner         = m_hWnd;
        ofn.hInstance         = NULL ;
        ofn.lpstrFilter       = "*.txt\0\0" ;
        ofn.lpstrCustomFilter = NULL ;
        ofn.nMaxCustFilter    = 0 ;
        ofn.nFilterIndex      = 0 ;
        ofn.nMaxFile          = MAX_PATH ;
        ofn.nMaxFileTitle     = MAX_PATH ;
        ofn.lpstrInitialDir   = "c:\\" ;
        ofn.lpstrTitle        = "保存到";
    ofn.lpstrFile   = szFullName ;
        ofn.nFileExtension    = 0 ;
        ofn.lpstrDefExt       = TEXT("txt") ;
        ofn.lCustData         = 0 ;
        ofn.lpfnHook          = NULL ;
        ofn.lpTemplateName    = NULL ;
        ofn.Flags             = OFN_ENABLESIZING | OFN_OVERWRITEPROMPT ;
        

    if(!::GetOpenFileName(&ofn))
    return;
      GetDlgItem(IDC_EDIT1)->SetWindowText(ofn.lpstrFile);

    }void CNetSendDlg::OnButton2() 
    {
    // m_PATH="c:\\1.jpg";
    GetDlgItem(IDC_EDIT1)->GetWindowText(m_PATH);    hwnd_p=this->m_hWnd;
    AfxBeginThread(ThreadA,NULL,THREAD_PRIORITY_IDLE);
    }
      

  6.   

    接收
    void CNetRecvDlg::OnButton1() 
    {
    CString szIP;
    GetDlgItem(IDC_EDIT1)->GetWindowText(szIP);
    struct sockaddr_in sin;
    WSADATA wsaData;    
    SOCKET sockClient;
    int IpPort;
    char *IpAddr;
    IpAddr=szIP.GetBuffer(szIP.GetLength());
    IpPort=800;

    if(WSAStartup(0x0101, &wsaData ))
    {
    AfxMessageBox("初始化 TCP/IP 协议栈发生错误!");
    return;
    }
    if(wsaData.wVersion != 0x0101)
    {
    AfxMessageBox("Winsock version is incorrect!");
    WSACleanup();
    return;
    }

    if ((sockClient = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
    {
    AfxMessageBox("Create socket error!");
    return;
    }


    sin.sin_family=AF_INET;
    sin.sin_addr.s_addr=inet_addr(IpAddr);
    sin.sin_port=htons((short)IpPort);


    int timeout=300; 
    int status=setsockopt(sockClient,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
    if(status)
    {
    MessageBox("设置超时错误");
    WSACleanup();
    return ;
    }
    int buf=10240;
        int status2=setsockopt(sockClient,SOL_SOCKET,SO_RCVBUF,(char*)&buf,sizeof(int));
    if(status2)
    {
    MessageBox("设置缓冲区大小错误");
    WSACleanup();
    return ;
    }


    if(connect (sockClient, (struct sockaddr *)&sin, sizeof (sin)) == SOCKET_ERROR)
    {
    MessageBox("连接错误");
    closesocket(sockClient);
    WSACleanup();
    return;
    }
    else{
    WIN32_FIND_DATA fd;
    ::Sleep(20);
    recv(sockClient,(char*)&fd,sizeof(WIN32_FIND_DATA),0);
    ////////////////////////////////////////////////////////
    //PROGRESS
    m_Progress.SetRange(0,(short)fd.nFileSizeLow); 
    m_Progress.SetPos(0);
    m_Progress.SetStep(1);
            ////////////////////////////////////////////////////
    CString m_ProDir="e:\\";
    CFile destFile(m_ProDir+fd.cFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
    UINT dwRead = 0;
    while(dwRead<fd.nFileSizeLow)
    {
    byte* data = new byte[2048];
    memset(data,0,2048);
        UINT dw=recv(sockClient,(char*)data,2048,0);
    destFile.Write(data, dw);
    dwRead+=dw;
    delete [] data;
    m_Progress.StepIt();
    }
    m_Progress.SetPos((short)fd.nFileSizeLow); 
    SetFileTime((HANDLE)destFile.m_hFile,&fd.ftCreationTime,
    &fd.ftLastAccessTime,&fd.ftLastWriteTime);
    SetFileAttributes(m_ProDir+fd.cFileName,fd.dwFileAttributes);
    destFile.Close();
    closesocket (sockClient);
    WSACleanup();
    }
    }---------------------
    by
    回复人: howtotell(天行健,君子以自强不息。) ( ) 信誉:100  2003-3-30 18:09:03  得分:0
      

  7.   

    谢谢楼上的朋友们,特别感谢JennyVenus() 。
    我正在调试你给的代码。
      

  8.   

    网上东东太多了
    到 http://www.vckbase.com/ 看看吧,中文的,应该很多才是
      

  9.   

    OK,I will to see http://www.vckbase.com/