随便你保存在文件中或者注册表中。只要不保存在内存中就可以了。不过要记住下次运行时自己要先从文件或注册表中读出来。Windows不会自动帮你读出来的。

解决方案 »

  1.   

               
    百联网讯社区群 中国软件 IT商务社区 软件商务社区 图片商务社区 轴承商务社区 
     
          
     
     返回主页   新闻聚焦  共享软件  行业软件  Linux园地  开发中心  专家门诊  项目交易  人力资源  
      
       
     
     
     
      
       所有待解决的问题
      所有已解决的问题
      所有精华区的问题
      我的问题  系统功能
        修改注册信息
        本月专家榜
        总专家榜
        热点问题
        在线名单  计算机用户
        软件使用
        资源使用
        软件注册
        我看软件
        寻找软件
        行业软件
        软件评测
        Windows95/98
        Windows NT/2000
        DOS
        Linux/UNIX
        硬件指南  软件开发者
        Visual C++
        Visual Basic
        Delphi
        C/C++
        C++ Builder
        ASM
        数据库开发
        PowerBuilder
        ActiveX/COM
        数据算法
        软件工程
        图形/游戏/多媒体
        安全技术
        网络/通讯
        技术书籍
        文件格式  Web开发者
        主页制作
        图形处理
        ASP
        PHP
        Perl
        Java
        Javascript  扩充话题
        程序人生
        软件市场
        程序员考试
        人才热线
        建议和意见
        灌水乐园
     
      
      我要回复 | 我感兴趣 | 打印贴子 | 推荐给朋友 | 关闭窗口  
    主  题:我想用vc++6编写一通用的socket程序,可在两台机器间传送文件
    作  者:gunboy
    所属论坛:Visual C++
    问题点数:50
    回复次数:8
    发表时间:2000-4-19 23:00:00
     
    我想用vc++6编写一通用的socket程序,可在两台机器间传送文件,请把源代码mail到
    [email protected]。我想通过它学习网络编程
    最好能用MFC的类CAsyncSocket。
    谢谢  
    回复贴子: 
    回复人:duhaohao(2000-4-20 1:31:00)  得50分 
    服 务 器 与 客 户 机
    互 传 消 息 
    南 京 理 工 大 学(960611)
    朱 晓 华([email protected]) 一、 服 务 器 程 序
    创 建 一 个 名 为“server" 的 项 目, 单 文 档 界 面。 
    在serverview.h 中 加 入 代 码: 
              #include “winsock.h"
          添 加 变 量:
                CSize      sizeTotal;// 控 制 滚 动 条
                int  count;// 信 息 条 数
                CString m_data[1000];// 信 息 存 放
                char    Hostname[260];
                char  Hostaddress[20];// 主 机IP 地 址
                SOCKET      m_sock;
                HANDLE      m_hListenThread;// 线 程
                BOOL  m_bInitialized;// 是 否 初 始 化
                WSADATA    WSAData;
                BOOL  flag;
                SOCKADDR_IN saClnt;
                int  saClntLen;
                BOOL  Isconnect;// 是 否 连 接    
    在serverview.cpp 中 重 载CServerView() 构 造 器, 创 建 并 绑 定 嵌 套 字: 
          CServerView::CServerView()
    {    // TODO: add construction code here
          Isconnect=FALSE;
          flag=FALSE;
          sizeTotal.cy=350;
          sizeTotal.cx=300;
          m_hListenThread;
          count=5;
          int status;
          WSADATA wsaData;
      m_data[0]=“initializing Windows Sockets DLL....";
          if((status=WSAStartup(0x0101, &wsaData))==0)
          {    m_data[0] +=“Succeeded";
                m_bInitialized=TRUE;
          }
          else
          {    m_bInitialized=FALSE;
          }
          m_sock=socket(AF_INET,SOCK_DGRAM,0);
          m_data[1]=“Creating socket....";
          if(m_sock==INVALID_SOCKET)
          {    m_data[1] +=“Failed";
          }
          m_data[1] +=“Succeeded";
          m_data[2]=“Binding socket....";
          sockaddr_in sa;
          sa.sin_family=AF_INET;
          sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
          sa.sin_port=htons(5050);
          if(bind(m_sock,(PSOCKADDR) 
        &sa,sizeof(sa))==SOCKET_ERROR)
          {    m_data[2] +=“Failed";
                closesocket(m_sock);
          }
          m_data[2] +=“Succeeded";
          m_data[3]=“Creating listener thread....";
          unsigned long idThread;
    m_hListenThread=CreateThread(NULL,0,
    (LPTHREAD_START_ROUTINE)Listen,
    (void        if(m_hListenThread)
          {    m_data[3] +=“Succeeded";
                m_data[4] +=“Listening....";
          }
          else
                m_data[4] +=“Failed";

    在 析 构 函 数 中 完 成 必 需 的 清 除 操 作: 
          CServerView:: ~CServerView()
    {    if(m_bInitialized)
          WSACleanup();
          closesocket(m_sock);
          if(m_hListenThread)
          ::TerminateThread(m_hListenThread,0);
    }    
    定 义 接 收 和 处 理 消 息 的 线 程: 
          long WINAPI Listen(CServerView *pView)
    {    char msg[2000]=“";
          int  nchar;
          SOCKADDR_IN saClnt;
          int saClntLen;
          while(1)
          { saClntLen=sizeof(saClnt);
            nchar=recvfrom(pView ->m_sock,msg,1024,0, 
    (PSOCKADDR) &saClnt, &saClntLen);
            if(nchar<0)
            {    pView ->m_data[pView ->count + +] +
                =“Error in recvfrom\n";
            pView ->InvalidateRect(NULL);
            }
            else
            {switch(msg[0])
            {
            case  ‘A':
            wsprintf(msg,“A:Client from %s attached\n",
                  inet_ntoa(saClnt.sin_addr));
            pView ->m_data[pView ->count + +]=msg;
            pView ->flag=TRUE;
            pView ->InvalidateRect(NULL);
            pView ->Isconnect=TRUE;
            pView ->saClnt=saClnt;
            pView ->saClntLen=saClntLen;
            sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR) 
            &saClnt,saClntLen);
            break;
                      
            case ‘D':
            wsprintf(msg,“D: Client form %s detached\n",
                    inet_ntoa(saClnt.sin_addr));
            pView ->m_data[pView ->count + +]=msg;
            pView ->flag=TRUE;
            pView ->InvalidateRect(NULL);
            pView ->Isconnect=FALSE;
          sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR) 
          &saClnt,saClntLen);
            break;
            case ‘R':
            saClntLen=sizeof(saClnt);
            pView ->m_data[pView ->count + +]=msg;
            pView ->flag=TRUE;
            pView ->InvalidateRect(NULL);
            break;
            default:
            break;
            }
            }
                
          }
          return(0);
    }
    在 程 序 菜 单 项 中 添 加“ 本 机IP 地 址": 
       void CServerView::OnIp() 
    {int WSAReturn;
    WSAReturn=WSAStartup( 0x0101, &WSAData );
    if( WSAReturn == 0 ){
    gethostname( Hostname, 260 );
    struct hostent *pHostEnt;
    pHostEnt = gethostbyname( Hostname);
    if( pHostEnt != NULL ){
    wsprintf( Hostaddress, “ %d. %d. %d. %d",
    ( pHostEnt ->h_addr_list[0][0] & 0x00ff ),
    ( pHostEnt ->h_addr_list[0][1] & 0x00ff ),
    ( pHostEnt ->h_addr_list[0][2] & 0x00ff ),
    ( pHostEnt ->h_addr_list[0][3] & 0x00ff ) );
       CString out;      
       out.Format(Hostaddress);
       AfxMessageBox(out);
       }
          }
    }
    在 程 序 菜 单 中 添 加“ 发 送 消 息": 
       void CServerView::OnSendmessage() 
    {// TODO: Add your command handler code here
          char msg[2000];
          Csend Sendmessage;
          if(Sendmessage.DoModal()==IDOK 
        & &!Sendmessage.m_Message.IsEmpty())
       { wsprintf(msg,“R: " +Sendmessage.m_Message);
       sendto(m_sock,msg,1024,0,(PSOCKADDR) 
          &saClnt,saClntLen);
       m_data[count + +]=Sendmessage.m_Message;
       flag=TRUE;
       InvalidateRect(NULL);
       }
    }
    为 发 送 消 息 项 添 加 一 个 对 话 框 的 类, 名 为send, 有 一 个 文 本 框, 用 来 发 送 消 息, 并 
    为 文 本 框 添 加CString m_Message 变 量, 在ServerView.cpp 中 添 加 #include “send.h" 
    为 发 送 消 息 项 添 加 一 个 判 断 函 数: 
        void CServerView::OnUpdateSendmessage(CCmdUI * 
    pCmdUI) 
    {// TODO: Add your command update UI handler code here
          pCmdUI ->Enable(FALSE);
          if(Isconnect)
          pCmdUI ->Enable(TRUE);
    }
    再 窗 口 显 示 消 息: 
          void CServerView::OnDraw(CDC * pDC)
    {    if(flag)
          {sizeTotal.cy +=20;
          for(int j=65;jTextOut(10,y,m_data[i]);
                y +=20;}
          // TODO: add draw code for native data here
    }
    在Project 中 点 击Settings 中 选 择Link 项 添 加wsock32.lib。
    ----最 后 编 译 程 序, 就 可 以 得 到Server.exe 程 序。 
    二、 客 户 机 程 序
    创 建 一 个 名 为“client" 的 项 目, 单 文 档 界 面。 
    在clientview.h 中 加 入 代 码: 
                #include “winsock.h"
        添 加 变 量:
                CString m_data[1000];
                HANDLE      m_hListenThread;
                SOCKET      m_sock;
                SOCKADDR_IN m_saSrvr;
                BOOL  Isconnect;
                int  count;
                CSize      sizeTotal;
                BOOL  flag;
    在 构 造 函 数 中 初 始 化 变 量: 
          CClientView::CClientView()
    {    // TODO: add construction code here
          Isconnect=FALSE;
          sizeTotal.cy=350;
          sizeTotal.cx=300;
          flag=FALSE;
    }
    在 析 构 函 数 中 完 成 清 除 操 作, 代 码 如 上。 
    在 菜 单 中 添 加“ 拨 号" 项: 
          void CClientView::OnDial() 
    {// TODO: Add your command handler code here
          count=5;
          if(m_bInitialized)
          {    AfxMessageBox(“Already dialing");
                return;}
          Cdial dial;
        if(dial.DoModal()==IDOK 
        & &!dial.m_HostAddress.IsEmpty())
          {m_saSrvr.sin_family=AF_INET;
          m_saSrvr.sin_addr.S_un.S_addr=htonl
    (INADDR_ANY);
          m_saSrvr.sin_addr.S_un.S_addr=inet_addr
    (dial.m_HostAddress);
          m_saSrvr.sin_port=htons(5050);
          int status;
          WSADATA wsaData;
          m_data[0]=“initializing Windows Sockets DLL....";
          if((status=WSAStartup(0x0101, &wsaData))==0)
          {    m_data[0] +=“Succeeded";
                m_bInitialized=TRUE;}
          else
          {    m_bInitialized=FALSE;}
          m_sock=socket(AF_INET,SOCK_DGRAM,0);
          m_data[1]=“Creating socket....";
          if(m_sock==INVALID_SOCKET)
          {    m_data[1] +=“Failed";}
          m_data[1] +=“Succeeded";
          m_data[2]=“Binding socket....";
          sockaddr_in sa;
          sa.sin_family=AF_INET;
          sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
          sa.sin_port=htons(0);
          if(bind(m_sock,(PSOCKADDR) 
        &sa,sizeof(sa))==SOCKET_ERROR)
          {    m_data[2] +=“Failed";
                closesocket(m_sock);}
          m_data[2] +=“Succeeded";
          m_data[3]=“Creating listener thread....";
          unsigned long idThread;
          m_hListenThread=CreateThread(NULL 0,
    (LPTHREAD_START_ROUTINE)Listen,
    (void *)this,0, &idThread);
          if(m_hListenThread)
          {    m_data[3] +=“Succeeded";
                m_data[4] +=“Waiting....";}
          else
          m_data[4] +=“Failed";
          InvalidateRect(NULL);
          }
    }
    添 加 一 个 拨 号 对 话 框, 名 为dial, 有 一 个 文 本 框 用 来 写IP 地 址. 并 在clientview.cpp 中
    添 加 代 码: 
          #include dial.h
    在 拨 号 项 添 加 一 个 判 断 函 数: 
        void CClientView::OnUpdateDial(CCmdUI * 
    pCmdUI) 
    {// TODO: Add your command update UI handler code here
          pCmdUI ->Enable(TRUE);
          if(Isconnect)
          pCmdUI ->Enable(FALSE);
    }
    添 加 接 收 与 发 送 消 息 的 线 程: 
          long WINAPI Listen(CClientView *pView)
    {    char msg[2000];
          pView ->m_data[5]=“Sending ATTACH command";
          pView ->InvalidateRect(NULL);
          wsprintf(msg,“A: ");
        sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR)
        &pView ->m_saSrvr,sizeof(pView ->m_saSrvr));
          int saSrvrLen ,nchar;
          while(1)
          {saSrvrLen=sizeof(pView ->m_saSrvr);
          nchar=recvfrom(pView ->m_sock,msg,1024,0,
      (PSOCKADDR) &pView ->m_saSrvr, &saSrvrLen);
          if(nchar<0)
        {    pView ->m_data[pView ->count + +]=
                “Error in recvform";
          pView ->InvalidateRect(NULL);}
          else
        { pView ->m_data[pView ->count + +]=msg;
                      pView ->Isconnect=TRUE;
                      pView ->flag=TRUE;
                      pView ->InvalidateRect(NULL);
                }
          }
          return(0);
    }
    同 主 程 序 一 样 做 一 个 发 送 消 息 项, 代 码 如 上。 
    显 示 程 序 也 与 主 程 序 一 样, 代 码 如 上。 
    在Project 中 点 击Settings 中 选 择Link 项 添 加wsock32.lib。 
    编 译 程 序 便 可 得 到client.exe 程 序。
    ----server.exe 和 client.exe 做 完 后, 就 可 以 在 具 有 TCP/IP 协 议 下 的 网 络 中 执 行。 
      
     
    回复人:wuzhouqun(2000-8-29 13:50:00)  得0分 
    关注! 
     
    回复人:lgs(2000-9-14 13:21:00)  得0分 
    我发送给你。 
     
    回复人:slssw(2000-9-19 8:28:00)  得0分 
    我是一个新手,想请问一下,这个程序我一直编译不过去,错误为:
    serverView.cpp(80) : error C2440: 'type cast' : cannot convert from '' to 'unsigned long (__stdcall *)(void *)'
            None of the functions with this name in scope match the target type
    80行程序为:m_hListenThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Listen,(void *)this,0,&idThread);
    我检查了很长时间,也找不出问题。希望能得到你的答复。 我的email地址为:[email protected] 
     
    回复人:huangzubin(2000-10-12 19:50:00)  得0分 
    use CSocketFile 
     
    回复人:scklotz(2000-10-28 10:29:00)  得0分 
    参数类型不合适,把代码给我一份,我帮你瞧瞧 
     
    回复人:softarts(2000-10-28 19:03:00)  得0分 
    我做过一个com组件,发送400m的文件都没问题 
     
    回复人:bclzi(2000-11-9 20:45:00)  得0分 
    用 CSocket和CSocketFile不是更方便吗?
     
      
    --------------------------------------------------------------------------------
     
    我要回复: 有人参与讨论这个问题,请用EMail通知我  
     返回问题 | 关闭窗口  
    两种都行了,不过用INI文件的较多,用函数GetPrivateProfileString读取,用函数
    WritePrivateProfileString写入就可以了
        
     
                
       
     
      

  2.   

    都可以,不过我觉得保存在注册表中好一些。
    示例代码如下:
        //读出注册表
        m_Registry = new TRegistry;
        if (m_Registry->OpenKey("Software\\Mytest",true))
        {
            Edit1->Text = m_Registry->ReadString("IPAddress");
            Edit2->Text = m_Registry->ReadString("Port");
        }
        m_Registry->CloseKey();
        m_Registry->Free();    //写入注册表
        m_Registry = new TRegistry;
        if (m_Registry->OpenKey("Software\\Mytest",true))
        {
            m_Registry->WriteString("IPAddress",Edit1->Text);
            m_Registry->WriteString("Port",Edit2->Text);
        }
        m_Registry->CloseKey();
        m_Registry->Free(); 
      

  3.   

    保存在注册表中好一些。
        //读出注册表
        m_Registry = new TRegistry;
        if (m_Registry->OpenKey("Software\\Mytest",true))
        {
            Edit1->Text = m_Registry->ReadString("IPAddress");
            Edit2->Text = m_Registry->ReadString("Port");
        }
        m_Registry->CloseKey();
        m_Registry->Free();    //写入注册表
        m_Registry = new TRegistry;
        if (m_Registry->OpenKey("Software\\Mytest",true))
        {
            m_Registry->WriteString("IPAddress",Edit1->Text);
            m_Registry->WriteString("Port",Edit2->Text);
        }
        m_Registry->CloseKey();
        m_Registry->Free();