PDA

View Full Version : حرفه ای: غير قابل استفاده بودن فايل ارسال شده از طريق سوكت!!!



hunter_ara
یک شنبه 20 آذر 1390, 16:34 عصر
سلام
من از روي ويندوز موبايل و با سوكت از طريق GPRS يه فايل رو به يه IP ميفرستم و رو سرور ميگيرمش
با فورمت خودش ذخيره ميكنم و فايل سيو ميشه(عكس)
ولي مشكلم اينجاس كه وقتي كيلوبايت اول فايل رو ميفرستم و سيو ميشه فايل سالمه و ميشه قسمتي كه اومده رو ديد ولي وقتي كيلوبايت 2 رو ميگيرم و سيو ميكنم فايل خراب ميشه!!!
تعداد بايت هاي فايل درسته ولي Preview نداره!!!!!
اگه لازمه بگين سمپل بزارم!!!!

zarrinnegar
یک شنبه 20 آذر 1390, 17:48 عصر
من با سوکت کار نکردم ولی فکر میکنم کیلوبایت دومی یه چیزی رو از کیلوبایت اولی overwrite میکنه و یا جابجا کپی میشن یعنی دومی میشینه جای اولی و اول فایل کپیش میکنی نه آخر اون

hunter_ara
سه شنبه 22 آذر 1390, 09:44 صبح
نه دوست عزيز من پكت ها رو جايي كپي نميكنم كه بخواد جا به جا يا Overwrite بشه!
هر پكت با يه كانكشن جداگانه فرستاده ميشه.
پكت 1 رو ميگيرم و با BinaryWriter و FileMod.CreateNew مينويسمش بعد پكت 2 مياد و باز به همون طريق ولي اين بار با FileMod.Append مينويسمش و بقيه به همين ترتيب!!!

كلاينت:

bool C = false; byte[] Continue = new byte[1]; byte[] fileNameByte = Encoding.UTF8.GetBytes(fileName); curMsg = "Buffering ..."; byte[] FileData = ReadAllBytes(filePath + fileName); byte[] clientData = new byte[FileData.Length]; byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length); byte[] Parity = Encoding.ASCII.GetBytes(clientData.Length.ToString ()); byte[] ParityLen = BitConverter.GetBytes(Parity.Length);FileData.Copy To(clientData, 0); MessageBox.Show("File Size: " + clientData.Length + "B\n\t " + (clientData.Length / 1024) + "KB"); //----------------- byte[] Packet = new byte[1024];// 1KB packet size int z = clientData.Length; int l = 0; for (int i = 0; i < clientData.Length; i++, l++) { Packet[Continue.Length + fileNameLen.Length + fileNameByte.Length + ParityLen.Length + Parity.Length + l ] = clientData[i]; if ((l == (1023 - (Continue.Length + fileNameLen.Length + fileNameByte.Length + ParityLen.Length + Parity.Length))) || (i == clientData.Length)) { if(i < (1023 - Continue.Length + fileNameLen.Length + fileNameByte.Length + ParityLen.Length + Parity.Length)) { C = false; } else { C = true; } Continue = BitConverter.GetBytes(C); Continue.CopyTo(Packet,0); fileNameLen.CopyTo(Packet, Continue.Length); fileNameByte.CopyTo(Packet, Continue.Length + fileNameLen.Length); ParityLen.CopyTo(Packet, Continue.Length + fileNameLen.Length + fileNameByte.Length); Parity.CopyTo(Packet, Continue.Length + fileNameLen.Length + fileNameByte.Length + ParityLen.Length + fileNameByte.Length); DoTcpConnection(Packet); z -= (1024 - (Continue.Length + fileNameLen.Length + fileNameByte.Length + ParityLen.Length + Parity.Length)); l = 0; } }
و سرور:

try
{
curMsg = "Starting...";
sock.Listen(100000);

curMsg = "Running and waiting to receive file.";
Socket clientSock = sock.Accept();

byte[] clientData = new byte[10/*MB*/* 1048576];

int receivedBytesLen = clientSock.Receive(clientData);
curMsg = "Receiving data...";
bool Continue = BitConverter.ToBoolean(clientData, 0);
int fileNameLen = BitConverter.ToInt32(clientData, 1);
string fileName = Encoding.UTF8.GetString(clientData, 5, fileNameLen);
int ParityLen = BitConverter.ToInt32(clientData, 5 + fileNameLen);
string Parity = Encoding.ASCII.GetString(clientData, 5 + 4 + fileNameLen, 5 + 4 + fileNameLen + ParityLen);
//if (Convert.ToInt32(Parity) != receivedBytesLen)
// MessageBox.Show("File is corrupted\n" + "Recieved file size: " + (receivedBytesLen / 1024) + "KB");
if (Continue == true)
{
BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + "/" + fileName, FileMode.Append));
bWrite.Write(clientData, 5 + 4 + fileNameLen + ParityLen, receivedBytesLen - 5 - 4 - fileNameLen - ParityLen);
bWrite.Close();
}
else
{
BinaryWriter bWriter = new BinaryWriter(File.Open(receivedPath + "/" + fileName, FileMode.CreateNew));
bWriter.Write(clientData, 5 + 4 + fileNameLen + ParityLen, receivedBytesLen - 5 - 4 - fileNameLen - ParityLen);
bWriter.Close();
}
curMsg = "Saving file...";
//clientSock.Close();
curMsg = "Reeived & Saved file";
}
catch (Exception ex)
{
curMsg = "File Receving error." + ex.Message;
}

اميدوارم دوستان كمك كنن :لبخندساده: