PDA

View Full Version : دریافت نادرست داده ها از طریق سوکت - نداخل بسته ها



saied_hacker
سه شنبه 19 فروردین 1393, 19:35 عصر
سلام

این یه برنامه است که سرور و کلاینت یکسری مکالماتی با هم دارن، در حالت عادی ( تعداد کم درخواست ها و پاسخ ها به خوبی کار میکنه ) اما وقتی سرور میخاد تعداد زیادی بسته رو پشت سر هم ارسال کنه توی کلایت مشکل پیش میاد و بسته ها قاطی میشن.
برای مثال این یک ارسال و دریافت بین سرور و کلاینت هست که سایز هربسته مشخص شده.


send ---------- 496 received ---------- 496
send ---------- 613
received ---------- 613
send ---------- 680
received ---------- 680
send ---------- 227
send ---------- 697
received ---------- 227
send ---------- 722
send ---------- 710
received ---------- 697
received ---------- 1432


از داده های بالا مسخص میشه که دو تا ارسال اخری که سرور انجام داده با سایز های 722 و 710 ( سایزش شده 1432 ) با هم دریافت شدن و اینجوری داده ها نامعتبر شده و به درد نمی خورن.
دوستان راه حلی برای این مشکل ندارن ؟؟؟

این کد برای دریافت در کلاینت هست :
private void ReceiverCallBack(IAsyncResult ar) {
try
{
int size = _socket.EndReceive(ar);
_socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiverCallBack), null);


System.Diagnostics.Trace.WriteLine(" received ---------- " + size.ToString());




if (MessageReceived != null)
{
byte[] temp = new byte[size];
Array.Copy(_buffer, temp, size);


MessageReceived(temp);
}
}
catch (Exception exp)
{
// :)
}


}



و این هم ارسال در سرور :

public bool SendMessage(Socket socket, byte[] message, string logMessage = "Unknow") {
try
{
MsgTemp msg = new MsgTemp(socket, logMessage, message);


System.Diagnostics.Trace.WriteLine(" send ---------- " + message.Length.ToString());


socket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendCallBack), msg);
return true;
}
catch
{
// :)
}
return false;
}


پیشاپیش متشکرم :بوس:

hadi0x7c7
سه شنبه 19 فروردین 1393, 20:24 عصر
البته من از این کد چیزی نفهمیدم، ولی شما چرا دریافت سمت کلاینت رو مثلا توی حلقه ای چیزی نمیزارید که که کامل اون بسته(؟) یا هر چیزی رو کامل دریافت کنه و کافیه کدش اونقسمت که بافر رو پر می کنه افست رو 0 ندید، بلکه اون مقدار چیزی که تا الان دریافت شده قرار بدین. البته فرض بر اینه که شما سایز اطلاعات دریافتی رو میدونید.

saied_hacker
پنج شنبه 21 فروردین 1393, 13:21 عصر
مشکل حل شد

ممنون اقای hadi0x7c7 مشکل این بود که من اصلا نمی دونستم با TCP ممکنه این مشکل پیش بیاد و چون قبلا کارای کوچیک تری کرده بودم با این مشکل مواجه نشده بودم :)
اینجا چون ممکنه چند تا ارسال پشت سر هم باشه با این مشکل موجه شدم
به هر حال اینجا به خوبی توضیخ داده
Simple Message Framing Sample for TCP Socket (http://blogs.msdn.com/b/joncole/archive/2006/03/20/simple-message-framing-sample-for-tcp-socket.aspx)