الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما سبب غلق ال connection في ال sockets فجاءة ؟

بدأه kimoi في 14 مايو 2010 · 10 رد · 1,479 مشاهدة · في برمجة الشبكات والتطبيقات الموزعة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اواجه مشكلة ان كل ما احاول اجري اتصال بين الطرفين ان فجاءة و قبل ما ابتدي انفذ اي كود تتحول ال sockets من connected to disconnected

و احيانا تكوت socket واحدة بس هي اللي متصلة و الاخري لأ و بعد ثانيتين او ثلاثة فجاءة تتحول ال socket الاخري لل disconnected

و هذا هو الكود المستحدم و لا اعلم اين المشكلة

شكرا لكم جميعا

//Connection Method
 public void ConnectToClient(string IP, int Port)
    {
      IPAddress ip = IPAddress.Parse(IP);
      IPEndPoint ipEndPoint = new IPEndPoint(ip, Port+2);
      IPEndPoint ipEndPointClient = new IPEndPoint(ip, Port);

      ClientSocket.Connect(ipEndPointClient);
      RemoteDesktopSocket.Connect(ipEndPoint);

    }

public void StartRecieveRemoteDesktop()
    {
      RemoteDesktopSocket.BeginReceive(ImageArray, 0, ImageArray.Length, SocketFlags.None, new AsyncCallback(OnRecieveRemoteDesktop), null);
    }

  //OnReceive Method 

    void OnRecieveRemoteDesktop(IAsyncResult ar)
    {
      try
      {
        RemoteDesktopSocket.EndReceive(ar);
        frm.RecieveImage(ImageArray);
        RemoteDesktopSocket.BeginReceive(ImageArray, 0, ImageArray.Length, SocketFlags.None, new AsyncCallback(OnRecieveRemoteDesktop), null);
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }

    }


// in the other node this is the ReceiveMethods
Form_Load
{
 s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 402);
            IPEndPoint ipEndPoint1 = new IPEndPoint(IPAddress.Any, 400);

            //Bind and listen on the given address
            s1.Bind(ipEndPoint1);


            s.Bind(ipEndPoint);
            s1.Listen(-1);
            s.Listen(-1);

             s1.BeginAccept(new AsyncCallback(onAccept1),null);

            s.BeginAccept(new AsyncCallback(onAccept), null);

}

  void onAccept(IAsyncResult ar)
        {
            newSocket=s.EndAccept(ar);
        }
        void onAccept1(IAsyncResult ar)
        {
        newSocket1= s1.EndAccept(ar);
        }
void StartRecieveEvents()
    {

      newSocket1.BeginReceive(message, 0, message.Length, SocketFlags.None, new AsyncCallback(OnRecieve), null);
    }

 void OnRecieve(IAsyncResult ar)
    {
      newSocket1.EndReceive(ar);
      events=Encoding.ASCII.GetString((message));
      EventsString=events.Split('*');
      rd= new PC_RemoteDesktop();
      rd.CallEvent(EventsString);
      newSocket1.BeginReceive(message, 0, message.Length, SocketFlags.None, new AsyncCallback(OnRecieve), null);


    }
#2

اخي الكريم

انت تمرر قيمة null في جميع الدوال التي تستخدمها منها على سبيل المثال

             s1.BeginAccept(new AsyncCallback(onAccept1),null);            s.BeginAccept(new AsyncCallback(onAccept), null);

وهنا سيتم تمرير قيمة null ايضا وبالتالي لا يتم اسناد اي قيم إلى Socket الجديدة الخاصة بالمتصل وبالتالي لن يكون هنالك اي اتصال:

 void onAccept(IAsyncResult ar)        {            newSocket=s.EndAccept(ar);        }        void onAccept1(IAsyncResult ar)        {        newSocket1= s1.EndAccept(ar);        }

انصحك بالإطلاع على طريقة عمل الإتصال غير المتزامن الفصل الرابع من هنا ويوجد ايضا امثلة بإمكانك الإستفادة منها

http://www.socketcoder.com/ArticleFile.aspx?index=2&ArticleID=67

واهلا وسهلا بك

#3

شكرا استاذ فادي علي الرد و الاهتمام و لكني بالفعل اطلعت علي كتابك قبل البداية في برمجة الشبكات و هو فعلا خير معين

و وجدتك في بعض الميثود مثل begin accept تمرر القيمة Null و في ميثود اخر تمرر نفس السوكيت

و انا اصلا لم افهم ما فائدة هذا المتغير و لذلك وضعته كله ب null :sleep:

فلو ممكن حضرتك توضحهولي اكتر عشان اقدر استخدمه صح فيما بعد لاني لم افهمه جيدا من الكتاب

و لك جزيل الشكر :)

#4

استاذ فادي

تمت التجربة و لكن تظل نفس المشكلة

لقد قمت بتعديل الكود الي

   s1.BeginAccept(new AsyncCallback(onAccept1),s1);

            s.BeginAccept(new AsyncCallback(onAccept), s);

تكون اول socket connected ثم تتحول لل disconnected و ال socket الاخري تكون null احيانا و احيانا اخر تكون اخذت قيمة و لكن disconnected

90694659.png

796809572.png

#5

اخي kimoi

من خلالها يتم تمرير بيانات السوكيت والتي تحتوي على بيانات المتصل وذلك بهدف تعريف New Socket جديد لكل متصل بحيث تستخدمها لاحقا للإرسال له والإستقبال منه

واما في حالة تمرير قيمة null واستخدام نفس السوكيت ففي هذه الحالة لن تتمكن من انشاء اكثر من اتصال واحد بكلينت واحد. كما يمكنك من خلالها تمرير اي نوع من البيانات وليس فقط السوكيت ...

على اي حال معرفة سبب المشاكل في الصورة يحتاج إلى تتبع البرنامج من البداية حتى يصل إلى تلك المرحلة وفي هذه الحالة لابد لك من رفع كود التطبيق الخاص بك حتى يتسنى لنا معرفة الخطوات التي قمت بها كما انصحك بتحميل احد الأمثلة الموجودة في الرابط السابق وقم بتطبيق نفس الخطوات على برنامجك, فإذا لم تنجح فقم برفع التطبيق الخاص بك أو عينة منه هنا...

واهلا وسهلا بك

#6

السلام عليكم استاذ فادي

شكرا جزيلا علي الاهتمام

و خلال اليومين الماضيين حاولت جاهدا علي قد ما اقدر اني اوصل لحل و غيرت استخدام السوكيت لبعت الصور الي TcpClient و لكن حدثت مشاكل ايضا و لكن في اجزاء اخري :ohmy:

فحاولت اظبط شكل الكود شوية واشيل العك اللي عملته و رفعته لعلي اجد الحل عند حضرتك او اي من اعضاء المنتدي الكرام

و شكرا لتعبك و مجهودكم

RemoteDesktop.rar

#7

اخي kimoi

كنت اتوقع بنظرة سريعة ان اجد مشكلتك خاصة انه مشروع تخرج لكن مشكلتك اكبر من ذلك حقيقة لا يوجد شيء مكتوب بشكل صحيح ولا يوجد ترتيب على الإطلاق فلا وقت لدي لإعادة ترتيب الكود الخاص بك مثلا انت تستدعي دوال الكونيكت واليسن من خلال Form load ثم تحاول عمل check على حالة الإتصال من خلال الثريد ومن خلال سوكيت اخر كيف ذلك واين قرأت ذلك؟؟؟ كما انك تخلط بين الطريقة المتزامنة والغير متزامنة فتستخدم ثريد اخر و انفنيتي لووب داخل دالة مستدعاة بالطريقة غير المتزامنة وهذا لوحده خطأ فادح واشياء كثيرة جدا... بالنسبة لي لا يوجد حل لمشكلتك إلى بحذف هذا المشروع وإعادته من جديد لكن بترتيب وتخطيط اخر, لذلك حاول في البداية تخطيط المشروع بشكل افضل وإعادة كتابة كل خطوة بشكل منفصل وبترتيب وحاول اتباع منهجية موحدة في كتابة المشروع وعدم الخلط بين الأمور...

بالتوفيق اخي الكريم

#8

استاذ فادي هذا الكود محاولات كثيررررة و ليس الكود الرئيسي انا مجرد حاولت اجمع اكبر عك عملته في جزء واحد و ده اللي عملته

انا مش طالب من حضرتك ولا من اي حد انه يحللي حاجة انا مجرد عايز افهم الفكرررررة

انا جربت اشتغل بالدوال التزامنية و الغير تزامنية و كل شيء و جربت استخدم ال TCPclient و هذه كانت اخر محاولة و اصلا بدايتي في برمجة النتورك كان تحدي شخصي بيني و بين نفسي و بحاول اكسبه

لاني ماكنتش افقه فيها اي شيء بس عموما شكرا علي التعب و الافادة و ان شاء الله هقدر احلها لان مفيش شيء مستحيل في البرمجة كما تعملت و عند حل المشكلة سوف ارفع السورس كود و سبب المشكلة اللي واجهتني عشان افيد بيها غيري

#9

هذا شيء جيد اخي kimoi واتمنى لك التوفيق فيه على اي حال انصحك وانصح جميع الأعضاء المبتدئين في برمجة الشبكات فهم الجانب النظري بشكل قوي لكل جزئية قبل البدأ بالجانب العملي حتى لا تتداخل الأمور ببعضها لديكم وهذا ليس في برمجة الشبكات وحسب وانما في كل علوم الكمبيوتر ...

مع تمنياتي لك بالتوفيق

#10

السلام عليكم استاذ فادي

هذا هو البرنامج بعد التعديل و تنظيم الكود الي حدا ما

و هو يعمل تمام

و اذا كنت بضع كود الكونكشن في الفورم لود و حاطت IPs فيه علي طول ده لان forms دي المفروض انها بيحصل فيها الاتصال يعني بتعمل load و هي متصلة لان هي جزء من برنامج تاني فبختار يوزر و اضغط علي remote Access فأقوم بأظهار ال forms

عموما هو البرنامج اعتقد كدة شكله بقي كويس شوية لان لما ارفقت الكود قبل كدة ارفقت الكود اللي بعمل test بيه و كان مبهدل و مغير فيه 2174 مرة

و البرنامج هو في مشكلة تظل اللي لسه لم استطع ايجاد حل لها اني اشغل ال remote desktop و ايضا ال keyboard and mouse events و جاري محاولة حل هذا الموضوع ان شاء الله

و شكرا مرة اخري استاذ فادي علي تعبك معايا طول الفترة اللي فاتت

السلام عليكم

NewRemoteDesktop.rar

#11
اقتباس
البرنامج هو في مشكلة تظل اللي لسه لم استطع ايجاد حل لها اني اشغل ال remote desktop و ايضا ال keyboard and mouse events

اذا كنت لا تريد استخدام Remoting في ارسال الإحداثيات فالأفضل ارسالها كـSerialized Object بحيث يحتوي على X و Y وكذلك Mouse Up/Down Events و Keyboard Press Events والأفضل من ذلك كله هو استخدام WCF With Duplex Service وانا بصدد كتابة موضوع عن هذا الأخير قريبا جدا إن شاء الله وتطبيقه على نظام Remote Desktop System يمكن ان يعمل من خلال الإنترنت...

بالتوفيق اخي الكريم

مواضيع مشابهة