我正在研究客户端 - 服务器应用程序。客户端项目在VS 2012 C#中设计,服务器端编码在C中完成。基本目标是客户端应用程序将读取文件并将其发送到服务器,服务器应用程序将其写入服务器。将要发送的文本文件包含数据
ls.db
abs.tst=8745566
xyz.xys=2239482
kpy.llk=0987789
但是当它写在服务器上时,它写为
abs.tst=8745566xyz.xys=2239482kpy.llk=0987789
应用程序完全读取发送的字节数。但是在写入文件时,最后会丢失一些字节。当我检查客户端文件和服务器文件的属性时,服务器大小文件丢失了6字节我给了我的客户端和服务器代码,请指导我如何解决这个问题
C#中的客户端代码
string[] lines = System.IO.File.ReadAllLines("local.db");
var binWriter = new System.IO.BinaryWriter(System.IO.File.OpenWrite("l2.db"));
foreach (string line1 in lines)
{
sslStream.Write(Encoding.ASCII.GetBytes(line1.ToString()));
}
sslStream.Write(Encoding.ASCII.GetBytes("EOF"));
基于Linux的服务器代码C
FILE * file = fopen("local2.db","w+");
memset(buff,0,sizeof(buff));
if(file!=NULL){
num = SSL_read(ssl,buff,sizeof(buff));
while(num>0){
if(strcmp(buff,"EOF")==0){
fclose(file);
break;
}else{
fwrite(buff,1,num,file);
memset(buff,0,sizeof(buff));
num = SSL_read(ssl,buff,sizeof(buff));
}
}
}
答案 0 :(得分:1)
sslStream.write()
不会插入任何换行符(\n
或\r\n
)字符。 File.ReadAllLines()
does not include line-end characters either。
因此,您正在编写一个长字节序列而没有任何分隔行终止符。这应该很容易修复:
string[] lines = System.IO.File.ReadAllLines("local.db");
var binWriter = new System.IO.BinaryWriter(System.IO.File.OpenWrite("l2.db"));
foreach (string line1 in lines)
{
// Write line with UNIX-style end-of-line character
sslStream.Write(Encoding.ASCII.GetBytes(line1.ToString() + "\n"));
}
sslStream.Write(Encoding.ASCII.GetBytes("EOF"));
如果您想获得该文件的精确副本,请不要使用ReadAllLines()
。使用ReadAllBytes()
:
byte[] filedata = System.IO.File.ReadAllBytes("local.db");
sslStream.Write(filedata);