PDA

View Full Version : عدم دريافت کامل فايل در انتقال با سوکت



Parastoo7
سه شنبه 21 شهریور 1391, 11:38 صبح
من دارم يک فايل را از يک سيستم به سيستم ديگري منتقل مي کنم . (در اينترنت با استفاده از IP Valid سرور)
وقتي فايل دريافت شده را باز مي کنم فايل صحيح نيست. يعني کامل به دستم نرسيده. (چند کيلو بايت اختلاف دارم)
هميشه و روي همه ي سيستم ها هم اينطور نيست . گاهي از روي يک سيستم اطلاعات کامل منتقل مي شود . اما بار دوم که تست مي کنم اطلاعات ناقصه.
کسي علت و راه حل اين موردو مي دو نه ؟

FastCode
سه شنبه 21 شهریور 1391, 13:21 عصر
اگر سرورتون تورنت ساپورت میکنه میتونید با تورنت فایلتون رو درست کنید.
http://www.hackernotcracker.com/2007-02/cleverly-repair-large-corrupted-files-with-bittorrent-client-checksum-hash-scans.html
فقط اونجایی که گفته باید تورنت رو پیدا کنید,شما باید تورنت رو در سورتون ایجاد کنید.

joker
سه شنبه 21 شهریور 1391, 14:04 عصر
اندازه بافر دريافتي را چقدر ست ميكني ؟
udp كار ميكني يا tcp ?

FastCode
سه شنبه 21 شهریور 1391, 15:11 عصر
اووه
من فکر کردم مشکلشون یک فایل ه

الان که دوباره سوال رو میخونم میفهمم کلاً اشتباه پاسخ دادم.

از هر چیزی ممکنه باشه.
چند وقت پیش به یک مورد خوردم که پس از چند ماه معلوم شد سویچی که در شبکه داخلی استفاده میشده packet ها رو drift میکرده.DLink

اگر ممکنه کد های مربوط به ارسال و دریافت رو بزارید و تفاوت مشخصات کلاینت هایی که مشکل دارند و ندارند رو هم بنویسید.

Parastoo7
سه شنبه 21 شهریور 1391, 16:21 عصر
اندازه بافر 1024 و از tcp استفاده مي کنم.

public void WaitForConnect()
{
//+++++++++++++++++++++++++++++++++++++++++++Start Waiting......
if (!conected)
{
TcpListener server = new TcpListener(ipAddress, port);
Status = "Listening for Connections on " + hostName + "...\n";
server.Start();
connection = server.AcceptSocket();
Status = "Client are now connected to the server";
conected = true;
}
byte a;
int counter;
//byte[] buff = new byte[100];
while (true)
{
try
{
byte[] clientData = new byte[1024 * 2000];
string receivedPath = "E:\\";
int receivedBytesLen = connection.Receive(clientData, SocketFlags.None);
int fileNameLen = BitConverter.ToInt32(clientData, 0);
string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
MessageBox.Show(" Client: " + connection.RemoteEndPoint + " connected & File: " + fileName);
BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName, FileMode.Append));
bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
MessageBox.Show("File: {0} received & saved at path: {1}", "Files: " + fileName + " received & saved at path: " + receivedPath);
bWrite.Close();
connection.Close();
}
catch (Exception ex)
{
conected = false;
Status = "Client DisConnected";
}
Thread.Sleep(1000);
}}



private void Form1_Load(object sender, EventArgs e)
{
ipEntry = Dns.GetHostByName(hostName);
addr = ipEntry.AddressList;
ipAddress = addr[0];
lbl_SystemIP.Text = ipAddress.ToString();

Thread _t = new Thread((new ThreadStart(WaitForConnect)));
_t.Start();
}



ارسال فايل:


Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSock.Connect("Server ip", 81);
string fileName = "4.jpg";
// "Your File Name";
string filePath = @"D:\";
//Your File Path;
byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
byte[] fileData = File.ReadAllBytes(filePath + fileName);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
MessageBox.Show((4 + fileNameByte.Length).ToString() + " " + fileData.Length.ToString());
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileNameByte.Length);
clientSock.Send(clientData);
clientSock.Close();
Console.ReadLine();

Parastoo7
سه شنبه 21 شهریور 1391, 16:23 عصر
البته سعي کردم از کدهاي ديگر هم استفاده کنم اما مشکل حل نشد.:ناراحت:

FastCode
سه شنبه 21 شهریور 1391, 18:05 عصر
چرا از یک سرور ه وب استفاده نمیکنید؟
lighttpd مثلاً؟