PDA

View Full Version : خطا هنگام ارسال فایل های بزرگ در شبکه



mousa1992
پنج شنبه 19 اردیبهشت 1392, 13:02 عصر
سلام دوستان
ممنون از توجهتون

متن ارور رو اول میذارم




The CLR has been unable to transition from COM context 0x4168f90 to COM context 0x41691e0 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.


راستش همچین فایل بزرگی هم نبود :D حجمش 25 مگ بود
برای ارسال این فایل ها تو شبکه از طریق سوکت چه روشی رو باید استفاده کرد ؟ ایا باید تیکه تیکه فرستاد فایلهارو ؟

منتظرم دوستان

با تشکر

mousa1992
پنج شنبه 19 اردیبهشت 1392, 13:30 عصر
و گاهی هم بدون هیچ خطایی برنامه سمت سرور ارسال رو متوقف میکنه و هنگ میکنه! ( حتی در مورد ارسال فایل های کوچیک هم این اتفاق می افته )

دوستان برنامه هارو قرار میدم لطفا بررسیشون کنید
ممنون از لطفتون

سمت سرور :
int port = 500;
string targetIP = "192.168.68.2";
TcpClient client;


public Form1()
{
InitializeComponent();

pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = Properties.Resources.loading;
}

private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
if (open.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(open.FileName, FileMode.Open, FileAccess.Read);
byte[] data = new byte[fs.Length];
fs.Read(data, 0, (Int32)fs.Length);

client = new TcpClient();
client.Connect(targetIP, port);

int bufferSize = client.ReceiveBufferSize;
int totalByteSend = 0;

NetworkStream ns = client.GetStream();

pictureBox1.Visible = label1.Visible = true;

for (int i = 0; i <= fs.Length / bufferSize; i++)
{
if (fs.Length - (i * bufferSize) >= bufferSize)
{
ns.Write(data, i * bufferSize, bufferSize);
totalByteSend += bufferSize;
}
else
{
ns.Write(data, i * bufferSize, (int)fs.Length - (i * bufferSize));
totalByteSend += (int)fs.Length - (i * bufferSize);
}

}

pictureBox1.Visible = label1.Visible = false;

MessageBox.Show("file sent" + " and total data sent is " + (float)((float)totalByteSend / 1048576));
}
}

کلاینت یا دریافت کننده :
int port = 500;
TcpListener listener;
TcpClient client;
NetworkStream ns;
BackgroundWorker bgw;

public Form1()
{
InitializeComponent();

IPHostEntry ips = Dns.GetHostByName(Dns.GetHostName());
IPAddress localip = IPAddress.Parse(ips.AddressList[0].ToString());

listener = new TcpListener(localip, port);

bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
}

void bgw_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
listener.Start();
client = listener.AcceptTcpClient();
ns = client.GetStream();
byte[] reciver = new byte[client.ReceiveBufferSize];
FileStream fs = new FileStream(Application.StartupPath + "\\" + new Random().Next(2, 10000).ToString(), FileMode.Append, FileAccess.Write);

do
{
int bytesRead = ns.Read(reciver, 0, client.ReceiveBufferSize);
fs.Write(reciver, 0, bytesRead);
}
while (ns.DataAvailable);

MessageBox.Show("file recived successfuly");
}
}

private void Form1_Load(object sender, EventArgs e)
{
bgw.RunWorkerAsync();
}

plus
پنج شنبه 19 اردیبهشت 1392, 16:27 عصر
شاید اشتباه کنم ولی به نظر میاد خطا ربطی به ارسال فایل و شبکه و... نداره، شما توی سرور، از OpenFileDialog استفاده نکن و بجاش آدرس فایل رو به صورت ثابت بده، ببین باز هم خطا میده؟
--
در ضمن شما اگه بجای فایل های پروژه (یا همراه اونها)، کدهای متدهای اصلی رو توی خود پست بگذارید (ازونجا که زیاد نیست کدشون) احتما زودتر به جواب میرسید.

mousa1992
پنج شنبه 19 اردیبهشت 1392, 19:17 عصر
شاید اشتباه کنم ولی به نظر میاد خطا ربطی به ارسال فایل و شبکه و... نداره، شما توی سرور، از OpenFileDialog استفاده نکن و بجاش آدرس فایل رو به صورت ثابت بده، ببین باز هم خطا میده؟
--
در ضمن شما اگه بجای فایل های پروژه (یا همراه اونها)، کدهای متدهای اصلی رو توی خود پست بگذارید (ازونجا که زیاد نیست کدشون) احتما زودتر به جواب میرسید.

سلام دوست عزیز ممنون از لطفتون و حضورتون باعث خوشحالی منه :قلب:
چشم این چیزی که شما میگید رو هم تست میکنم ولی بعید میدونم مشکل از openfiledialog باشه - قبلا هم تاپیک زدم تو این موضوع متاسفانه دوستان لطفشونو دریغ کردن :(
کدهارو هم قرار میدم
بازم ممنون از حضورتون
موفق باشید

mousa1992
جمعه 20 اردیبهشت 1392, 11:34 صبح
به نظر میاد برنامه سمت سرور مشکل داشته باشه و ارسالو متوقف میکنه :متفکر:
در ارسال فایل های بزرگتر از 10 مگ برنامه متوقف میشه بدون هیچ اروری و یبار هم اروری رو که در پست 1 گذاشتم گرفتم و فایل های کمتر از 10 مگ هم گاهی کامل و بدرستی ارسال میشه و گاهی هم سرور متوقف میکنه ارسالو ! مثلا 1 مگ ارسال میشه

plus
جمعه 20 اردیبهشت 1392, 15:10 عصر
do
{
int bytesRead = ns.Read(reciver, 0, client.ReceiveBufferSize);
fs.Write(reciver, 0, bytesRead);
}
while (ns.DataAvailable);

رو با

int bytesRead;
do
{
bytesRead = ns.Read(reciver, 0, client.ReceiveBufferSize);
fs.Write(reciver, 0, bytesRead);
}
while (bytesRead != 0);

جایگزین کنید.
در ضمن شما stream هایی که باز میکنید رو close نمیکنید، و از پورت 500 استفاده میکنید.پورتهای زیر 1000 مختص سیستم هست.البته این دو مورد ربطی به موضوعی که گفتین نداره اما میتونه مشکل ایجاد کنه.

mousa1992
شنبه 21 اردیبهشت 1392, 01:10 صبح
سلام دوست خوبم plus (http://barnamenevis.org/member.php?8256-plus) عزیز ممنونم از راهنماییتون نمیدونم چجوری باید تشکر کنم ازتون بابت کمک بزرگی که بهم کردید
با تغییر کدی که گفتید تونستم فایلهامو بدون مشکل انتقال بدم :تشویق:
لطف بزرگی در حقم کردید
بازم ممنونم ممنون