如何开发应用程序将客户服务器数据库的备份,下载到本地的云服务上?

---恢复内容开始---

如何做到将客户服务器数据库的备份,下载到本地的云服务上? 在开发这个程序中中途也遇到了一下问题,下面我将自己如何进解决的办法写出来供大家参考。

一.首先我需要进行描述一下问题:

1.比如有两台服务器A,B(云服务器) 将A中的服务器中的数据库的备份进行下载到B的云服务中并保存。

2.当然这台A服务器的外网是可以进行访问,如果外网访问不了的话,那也是没有办法的。

3.然后在B服务器中定期的进行删除数据库备份,定时的下载。并进行保存最新一个星期的数据库备份。

4.在云服务需要保存最新的数据库备份,当然不止一个数据库备份了,并进行定期的删除以及下载。

二:遇到的一些问题:

1.WebServices安全通道建立信任关系的异常。

2.数据库备份过大问题,无法下载。采用文件流的方式进行压缩。

3.在做定时删除以及下载的程序的时候使用Windows服务开发还是使用控制台然后挂在任务计划程序上。

4.如何进行读或者取数据库备份。通过FilesGetter.GetFiles(_fileDir, filter)方法。

5.压缩问题等等。应用BZip2.Compress(srcFile, zipFile, 8192);进行压缩以8M为一个压缩块。

6.备份策略,每天,每周,每月。应用任务计划程序。

二:需要的使用那些技术:

1.经过考虑了一下需要创建一个WebServices。

2.需要创建3个控制台应用程序其中分别包括(下载控制台应用程序,删除的控制台应用程序,压缩的控制台应用程序)。

3.文件流的使用,webClient 的应用等等

三:整个下载过程的流程图

四:各个模块的代码

1.先进行通过控制台应用程序进行对客户服务器的数据库备份进行压缩。

  1  class Program
  2     {
  3         static void Main(string[] args)
  4         {
  5             string fileDir = Properties.Settings.Default.DB_FILE_PATH;//客户的服务器的数据库备份文件的路径
  6
  7             string saveCompress = Properties.Settings.Default.DB_COMPRESS_PATH;
  8             try
  9             {
 10             #region 1.数据库文件所在服务器的目录的位置
 11             if (string.IsNullOrEmpty(fileDir) || !Directory.Exists(fileDir))
 12             {
 13                 throw new Exception("配置文件目录不正确,请检查" + fileDir);
 14             }
 15             #endregion
 16             #region 2.进行获取其中的压缩后的所有的文件
 17             string[] dir = new string[] { "*.001" };
 18             List<string> dbFileUrl = new List<string>();
 19             if (dir != null)
 20             {
 21                 foreach (var filter in dir)
 22                 {
 23                     dbFileUrl.AddRange(FilesGetter.GetFiles(fileDir, filter));
 24                 }
 25             }
 26             #endregion
 27             #region 3.引用第三方进行压缩文件并将文件放到指定的压缩的目录下面
 28             if (dbFileUrl != null)
 29             {
 30                 foreach (var url in dbFileUrl)
 31                 {
 32                     //引用第三方的ZIP压缩的方法进行压缩文件并将压缩的文件进行保存到客户的服务器的指定的目录下面
 33                     string zipDownUrl = saveCompress + Path.GetFileName(url) + ".rar";
 34                     //进行压缩文件越大那么压缩的时间越长
 35                     if (url != null && zipDownUrl != null)
 36                     {
 37                         Console.WriteLine("数据库{0}文件{1}压缩开始", Path.GetFileName(url),DateTime.Now);
 38                         if (BZipFile(url, zipDownUrl) == true)
 39                         {
 40                             using (StreamWriter sw = new StreamWriter(saveCompress + "数据库备份压缩日志.txt", true))
 41                             {
 42                                 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "数据库备份压缩开始" + "数据库的备份的文件压缩的文件的名称:" + Path.GetFileName(url) + "数据库备份压缩的路径:" + fileDir);
 43                             }
 44                             Console.WriteLine("数据库{0}文件{1}压缩结束", Path.GetFileName(url), DateTime.Now);
 45                         }
 46                         else
 47                         {
 48                             Console.WriteLine("数据库文件压缩失败!");
 49                         }
 50                     }
 51                     else
 52                     {
 53                         Console.WriteLine("数据库文件压缩失败!");
 54                     }
 55                 }
 56                 //当所有的数据库备份文件压缩完成后那么将压缩的日志进行写入到记事本中
 57                 using (StreamWriter sw = new StreamWriter(saveCompress + "数据库备份压缩日志.txt", true))
 58                 {
 59                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "数据库备份压缩结束");
 60                 }
 61             }
 62
 63             #endregion
 64             }
 65             catch(Exception  ex)
 66             {
 67                 //将数据库备份的日志写入到记事本中去
 68                 using (StreamWriter sw = new StreamWriter(saveCompress + "数据库备份压缩日志.txt", true))
 69                 {
 70                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "数据库备份的压缩中进行捕捉的异常" + ex.Message);
 71                 }
 72             }
 73
 74         }
 75
 76         /// <summary>
 77         ///进行压缩数据库的备份的文件
 78         /// </summary>
 79         /// <param name="sourcefilename"></param>
 80         /// <param name="zipfilename"></param>
 81         /// <returns></returns>
 82         public static bool BZipFile(string sourcefilename, string zipfilename)
 83         {
 84             bool blResult;//表示压缩是否成功的返回结果
 85             //为源文件创建文件流实例,作为压缩方法的输入流参数
 86             FileStream srcFile = File.OpenRead(sourcefilename);
 87             //为压缩文件创建文件流实例,作为压缩方法的输出流参数
 88             FileStream zipFile = File.Open(zipfilename, FileMode.Create);
 89             try
 90             {
 91                 //以8192节作为一个块的方式压缩文件8M一块进行压缩
 92                 BZip2.Compress(srcFile, zipFile, 8192);
 93                 blResult = true;
 94             }
 95             catch (Exception ex)
 96             {
 97                 Console.WriteLine(ex.Message);
 98                 blResult = false;
 99             }
100             srcFile.Close();//关闭源文件流
101             zipFile.Close();//关闭压缩文件流
102             return blResult;
103         }
104     }

通过创建一个控制台来进行压缩数据库备份文件

2.读取客户服务器数据库的备份压缩文件的名称,通过拼接一个下载的路径URL,返回多个数据库备份文件路径的集合。

  1 namespace DBDownLoad.Server.Services
  2 {
  3     /// <summary>
  4     /// Summary description for DbFileProvider
  5     /// </summary>
  6     [WebService(Namespace = "http://tempuri.org/")]
  7     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  8     [System.ComponentModel.ToolboxItem(false)]
  9     public class DbFileProvider : System.Web.Services.WebService
 10     {
 11         private static string _fileDir;
 12         private static string _rootUrl;
 13         [WebMethod]
 14         public List<string> GetDbFile()
 15         {
 16             //对方客户的数据库文件所在服务器的目录的位置
 17             _fileDir = System.Configuration.ConfigurationManager.AppSettings["DbBackupFilePath"];
 18             //实现文件下载地址的拼接 将所有的数据库的文件进行下载后然后进行其中的文件的拼接。
 19             _rootUrl = System.Configuration.ConfigurationManager.AppSettings["DbBackupFileRootUrl"];
 20             #region 1.数据库文件所在服务器的目录的位置
 21             List<string> displayUrlList = new List<string>();
 22             if (string.IsNullOrEmpty(_fileDir) || !Directory.Exists(_fileDir))
 23             {
 24                 throw new Exception("配置文件目录不正确,请检查" + _fileDir);
 25             }
 26             #endregion
 27             #region 2.确定其中的文件是否下载成功
 28             string[] txt = new string[] { "*.txt" };
 29             List<string> dbTxt = new List<string>();
 30             if (txt != null)
 31             {
 32                 foreach (var items in txt)
 33                 {
 34                     dbTxt.AddRange(FilesGetter.GetFiles(_fileDir, items));
 35                 }
 36             }
 37             #endregion
 38             if (dbTxt.Count()>0)
 39             {
 40                 #region 3.进行获取其中的压缩后的所有的文件
 41             string[] dir = new string[] { "*.rar" };
 42             List<string> dbFileUrl = new List<string>();
 43             if (dir != null)
 44             {
 45                 foreach (var filter in dir)
 46                 {
 47                     dbFileUrl.AddRange(FilesGetter.GetFiles(_fileDir, filter));
 48                 }
 49             }
 50             #endregion
 51                 #region 4.进行获取备份文件的文件名和时间的集合
 52             List<DBNameAndTime> dbFileNameList = new List<DBNameAndTime>();
 53             if (dbFileUrl != null)
 54             {
 55                 foreach (var url in dbFileUrl)
 56                 {
 57                     FileInfo fi = new FileInfo(url);
 58                     DBNameAndTime file = new DBNameAndTime();
 59                     file.FileName = fi.Name;// 文件名
 60                     file.FileTime = fi.LastWriteTime;// 文件时间
 61                     file.Url = url;
 62                     //进行获取数据库名称
 63                     var strArr = fi.Name.Split(‘.‘);
 64                     if (strArr.Length > 0)
 65                     {
 66                         //分离其中的文件的名称
 67                         file.DataName = strArr[0].ToString();
 68                     }
 69                     if (file != null)
 70                     {
 71                         dbFileNameList.Add(file);
 72                     }
 73                 }
 74             }
 75             #endregion
 76                 #region   5.进行获取备份文件的数据库名称的集合
 77             List<string> dataNameList = new List<string>();
 78             foreach (var item in dbFileNameList)
 79             {
 80                 if (!dataNameList.Contains(item.DataName))
 81                 {
 82                     dataNameList.Add(item.DataName);
 83                 }
 84             }
 85             #endregion
 86                 #region  6.进行遍历数据库名称集合,获取到每个数据库备份的最新的文件路径
 87
 88             foreach (var dataName in dataNameList)
 89             {
 90                 //第一步将每个数据库的备份找出来
 91                 List<DBNameAndTime> tempList = new List<DBNameAndTime>();
 92                 foreach (var fileName in dbFileNameList)
 93                 {
 94                     if (dataName == fileName.DataName)
 95                     {
 96                         tempList.Add(fileName);
 97                     }
 98                 }
 99                 //第二步筛选出最新的文件
100                 var newFile = tempList.OrderByDescending(a => a.FileTime).FirstOrDefault();
101
102                 //第三步将最新的文件的路径添加到要下载的集合中
103                 if (newFile != null)
104                 {
105                     //进行返回下载的文件的URL的压缩包格式的文件
106                     string downUrl = newFile.DownUrl;
107                     displayUrlList.Add(downUrl);
108                 }
109             }
110             #endregion
111             }
112             return displayUrlList;
113         }
114
115         //进行声明备份数据库的类
116         public class DBNameAndTime
117         {
118             private string fileName;
119             /// <summary>
120             /// 文件名称
121             /// </summary>
122             public string FileName { get { return fileName; } set { fileName = value; } }
123
124             private DateTime fileTime;
125             /// <summary>
126             /// 文件的最后修改时间
127             /// </summary>
128             public DateTime FileTime { get { return fileTime; } set { fileTime = value; } }
129
130             private string dataName;
131             /// <summary>
132             /// 数据库名称
133             /// </summary>
134             public string DataName { get { return dataName; } set { dataName = value; } }
135
136             private string url;
137             /// <summary>
138             /// 文件路径
139             /// </summary>
140             public string Url { get { return url; } set { url = value; } }
141
142             public string DownUrl { get { return _rootUrl + fileName; } }
143         }
144     }
145 }

应用WebServices进行开发应用程序来返回下载路径的集合

3.创建控制台应用程序进行远程下载通过获取WebServices 返回的List<string> 进行下载

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //通过代码进行建立SSL认证关系否则会出现未能为 SSL/TLS 安全通道建立信任关系.
 6             ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
 7             ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
 8             WebClient client = new WebClient();
 9             DbFileUrlProviderSvc.DbFileProviderSoapClient svcClient = new DbFileUrlProviderSvc.DbFileProviderSoapClient();
10             DbFileUrlProviderSvc.ArrayOfString latstFileUrlArray = svcClient.GetDbFile();
11             string receivePath = Properties.Settings.Default.LOCAL_PATH;//公司的云服务器保存下载文件的路径
12             try
13             {
14                 // 对从svc取出的url循环下载获取最新的文件
15                 if (receivePath != null)
16                 {
17                     if (latstFileUrlArray != null)
18                     {
19                         foreach (var downloadPath in latstFileUrlArray.ToList())
20                         {
21                             //将下载的文件进行保存到指定的文件夹
22                             if (downloadPath != null)
23                             {
24                                 //将数据库备份的日志写入到记事本中去
25                                 using (StreamWriter sw = new StreamWriter(receivePath + "数据库下载的日志.txt", true))
26                                 {
27                                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "数据库备份下载开始:" + "下载的路径:" + downloadPath + "接收的路径:" + receivePath + "下载文件的名称:" + Path.GetFileName(downloadPath));
28                                 }
29                                 //下载数据库备份文件
30                                 Console.WriteLine("数据库备份压缩包下载开始{0}!", DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss"));
31                                 client.DownloadFile(downloadPath, receivePath + Path.GetFileName(downloadPath));
32                                 Console.WriteLine("恭喜你备份{0}文件时间{1}下载完成,进入本地{2}下面进行查看!", Path.GetFileName(downloadPath), DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss"), receivePath);
33                             }
34                         }
35                     }
36                 }
37             }
38             catch(Exception ex)
39             {
40                 //将数据库备份的日志写入到记事本中去
41                 using (StreamWriter sw = new StreamWriter(receivePath + "数据库下载的日志.txt", true))
42                 {
43                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "数据库备份下载中进行捕捉的异常:"+ex.Message);
44                 }
45             }
46
47         }
48
49     }

创建控制台应用程序进行远程下载通过获取WebServices 返回的List<string>URL 集合进行下载

4.定期的进行删除数据库备份文件

  1  class Program
  2     {
  3         static void Main(string[] args)
  4         {
  5             //获取其中的数据库的备份的路径
  6             string strDirfile = Properties.Settings.Default.DB_FILE_PATH;
  7             int keepFileCnt = int.Parse(Properties.Settings.Default.KEEP_FILE_CNT);
  8             try
  9             {
 10                 //获取该目录下的所有文件,筛选出最新的 现将所有的数据库的文件进行获取出来。
 11                 if (string.IsNullOrEmpty(strDirfile) || !Directory.Exists(strDirfile))
 12                 {
 13                     Console.WriteLine("配置的文件的路径不正确请检查{0}" + strDirfile);
 14                 }
 15                 if (keepFileCnt <= 0)
 16                 {
 17                     Console.WriteLine("没有配置删除的天数");
 18                 }
 19
 20                 if (strDirfile != null)
 21                 {
 22                     if (Directory.Exists(strDirfile))
 23                     {
 24                         string[] strDirs = Directory.GetDirectories(strDirfile);
 25                         string[] strFiles = Directory.GetFiles(strDirfile);
 26                         DBNameAndTime file = new DBNameAndTime();
 27                         //进行获取根目录下面所有的数据库的文件的URL
 28                         if (strFiles!=null)
 29                         {
 30                             foreach (string strFile in strFiles)
 31                             {
 32                                 if (strFile != null)
 33                                 {
 34                                     FileInfo fi = new FileInfo(strFile);
 35                                     string[] strArr = fi.Name.Split(‘.‘);
 36                                     file.DataName = fi.Name;//文件的名称也就是备份数据库的名称
 37                                     file.FileTime = strArr[4];// 文件中备份的时间
 38                                     file.Url = strFile;
 39                                     DateTime dt1 =fi.LastWriteTime;//文件最后的写入的时间
 40                                     //然后进行分离其中的数据库的备份的时间
 41                                     if (strArr.Length > 0)
 42                                     {
 43                                         IFormatProvider provider = new CultureInfo("zh-CN");
 44                                         string tarStr = "yyyyMMddHHmmss";
 45                                         DateTime dt2 = DateTime.ParseExact(file.FileTime.ToString(), tarStr, provider);
 46                                         TimeSpan ts = dt1 - dt2;
 47                                         //进行日期的比较是不是3天前的如果是那么就进行删除
 48                                         if (ts.TotalDays >= keepFileCnt)
 49                                         {
 50                                             //进行删除其中时间为3天的旧文件
 51                                             if (strFile != null)
 52                                             {
 53                                                 //进行根据文件中的创建的时间
 54                                                 File.Delete(strFile);
 55                                                 //将数据库备份的日志写入到记事本中去
 56                                                 using (StreamWriter sw = new StreamWriter(strDirfile + "数据库备份的删除日志.txt", true))
 57                                                 {
 58                                                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "数据库备份删除开始:" + "删除的路径:" + strDirfile);
 59                                                 }
 60                                                 Console.WriteLine("{0}数据库备份文件删除成功!", DateTime.Now);
 61                                             }
 62                                             else
 63                                             {
 64                                                 Console.WriteLine("删除文件失败!");
 65                                             }
 66                                         }
 67                                         else
 68                                         {
 69                                             Console.WriteLine("其他的备份文件都是最新的没有3天前的备份!");
 70                                         }
 71                                     }
 72                                 }
 73                             }
 74                         }
 75
 76                         //保存删除的根目录的文件夹
 77                         foreach (string strdir in strDirs)
 78                         {
 79                             Directory.Delete(strdir, true);
 80                         }
 81
 82                     }
 83                     else
 84                     {
 85                         Console.WriteLine("此目录中只有根目录了!");
 86                     }
 87                 }
 88                 else
 89                 {
 90                     Console.WriteLine("此目录不存在!");
 91                 }
 92
 93             }
 94             catch (Exception ex)
 95             {
 96                 //将数据库备份的异常写入到记事本中
 97                 using (StreamWriter sw = new StreamWriter(strDirfile + "数据库备份的删除的日志.txt", true))
 98                 {
 99                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "备份文件都是最新的没有3天前的备份");
100                 }
101             }
102         }
103     }
104     //进行声明备份数据库的类
105     public class DBNameAndTime
106     {
107         private string fileName;
108         /// <summary>
109         /// 文件名称
110         /// </summary>
111         public string FileName { get { return fileName; } set { fileName = value; } }
112
113         private string fileTime;
114         /// <summary>
115         /// 文件的最后修改时间
116         /// </summary>
117         public string FileTime { get { return fileTime; } set { fileTime = value; } }
118
119         private string dataName;
120         /// <summary>
121         /// 数据库名称
122         /// </summary>
123         public string DataName { get { return dataName; } set { dataName = value; } }
124
125         private string url;
126         /// <summary>
127         /// 文件路径
128         /// </summary>
129         public string Url { get { return url; } set { url = value; } }
130
131         public string DownUrl { get { return fileName; } }
132     }

定期的进行删除数据库备份文件

5.当所用的程序开发完毕后那么就可以进行测试了,首先需要进行在任务计划程序中进行部署计划任务将.exe 程序添加其中,并进行设置确定的时间。

6.当所用的计划任务程序都进行部署完成后那么需要将webServices进行托管到IIS上。

7.当这些任务完成后那么就可以了下载数据库备份了。

---恢复内容结束---                                                                                                                                                                             2016.11.17

时间: 2024-10-14 04:12:32

如何开发应用程序将客户服务器数据库的备份,下载到本地的云服务上?的相关文章

Java程序中实现 MySQL数据库的备份与还原

案例代码: 数据库备份 1 //mysqldump -h端口号 -u用户 -p密码 数据库 > d:/test.sql --备份D盘 2 //备份 3 public static void dataBaseDump(String port,String username,String password,String databasename,String sqlname) throws Exception { 4 File file = new File("F:\\test");

从远程服务器数据库中同步数据到本地数据库 sql server 2008 开启分布

控制面板\所有控制面板项\管理工具 打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“我的电脑”上点击右键.在MSDTC选项卡中,点击“安全配置”按钮. 在安全配置窗口中做如下设置: l         选中“网络DTC访问” l         在客户端管理中选中“允许远程客户端”“允许远程管理” l         在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证” l         保证DTC登陆账户为:NT   Authority\NetworkService

解决SharePoint “/”应用程序中的服务器错误。

"/"应用程序中的服务器错误. 访问被拒绝. 说明:访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭据和 Web 服务器上启用的身份验证方法查看此目录或页.请与 Web 服务器的管理员联系以获得其他帮助. 解决方法--管理中心--应用程序管理--选择当前应用程序--单击--身份验证提供程序--默认--弹出的页面里选中集成的Windows验证 如下图 然后就OK了. 版权

第十篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 上 )

前言 本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 ):同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程序的技巧. 客户端 1 #include "unp.h" 2 3 void str_cli(FILE *fp, int sockfd); 4 5 int 6 main(int argc, char **argv) 7 { 8 int sockfd; 9 struct sockaddr_in

TCP客户/服务器程序概述

一个回射服务器: 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 回射输入行这样一个客户/服务器程序是一个尽管简单然而有效的网络程序例子 实现任何客户/服务器网络应用所需的所有基本步骤可通过本例子阐述 若想把本例子扩充成你自己的应用程序,你只需修改服务器对来自客户的输入的处理过程 除了以正常的方式运行本例子的客户和服务器(即键入一行文本并观察它的回射)之外 我们还会讨论它的许多边界条件: 客户和

【UNIX网络编程(三)】TCP客户/服务器程序示例

上一节给出了TCP网络编程的函数,这一节使用那些基本函数编写一个完成的TCP客户/服务器程序示例. 该例子执行的步骤如下: 1.客户从标准输入读入一行文本,并写给服务器. 2.服务器从网络输入读入这行文本,并回射给客户. 3.客户从网络输入读入这行回射文本,并显示在标准输出上. 用图描述如下: 编写TCP回射服务器程序如下: #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <st

UNIX网络编程笔记(4)—TCP客户/服务器程序示例

TCP客户/服务器程序示例 这一章信息量开始大起来了,粗略来看它实现了简单的TCP客户/服务器程序,里面也有一些费解的细节. 1.概述 完整的TCP客户/服务器程序示例.这个简单的例子将执行如下步骤的一个回射服务器(这里的回射服务器就是服务简单的把客户端发送的消息返回给客户): 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 这样实际上就构成了一个全双工的TCP连接. 本章就围绕了这个简单的TC

linux程序设计——使用FIFO的客户/服务器的应用程序(第十三章)

13.6.2    使用FIFO的客户/服务器应用程序 作为学习FIFO的最后一部分内容,现在考虑怎样通过命名管道来编写一个非常简答的客户/服务器应用程序.用一个服务器进程来接受请求,对它们进行处理,最后把结果数据返回给发送请求的一方:客户. 如果想要允许多个客户进行都可以向服务器发送数据,假设被处理的数据可以被拆分为一个个数据块,每个的长度都小于PIPE_BUF字节. 因为服务器每次只能处理一个数据块,所以只使用一个FIFO应该是合乎逻辑的,服务器通过它读取数据,每个客户向它写数据.只要将FI

UNIX网络编程入门——TCP客户/服务器程序详解

前言 最近刚开始看APUE和UNP来学习socket套接字编程,因为网络这方面我还没接触过,要等到下学期才上计算机网络这门课,所以我就找了本教材啃了一两天,也算是入了个门. 至于APUE和UNP这两本书,书是好书,网上也说这书是给进入unix网络编程领域初学者的圣经,这个不可置否,但这个初学者,我认为指的是接受过完整计算机本科教育的研究生初学者,需要具有完整计算机系统,体系结构,网络基础知识.基础没打好就上来啃书反而会适得其反,不过对于我来说也没什么关系,因为基础课也都上得差不多了,而且如果书读