إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

برنامج شات بلغة C وعتمادا على مكتبة Gtk

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • [برنامج] برنامج شات بلغة C وعتمادا على مكتبة Gtk

    بسم الله الرحمن الرحيم

    منذ فترة ليست بالقصيرة كنت صممت برنامج شات جماعي باستخدام VB6 وبعد ذلك قمت بتحول الكود إلى gambas2 . وكان شغال جيد وكل شيء تمام
    لكن بعد تجربته مع بعض الاخوة اكتشفت أن برنامج gbr2 المسؤول عن تشغيل ملفات gambas2 يتوقف لما يكون أتصالات كثيرة فقررت أحول الكود إلى C لأنها أقوى في هذا المجال واستعنت بمكتبة Gtk

    الحقيقة لما بدأت بكتابة الكود بلغة C واجهتني بعض المشاكل خصوصا أن طبيعة البرنامج الذي أنا بصدد برمجته هو أنه شات جماعي يعني برنامج السيرفور يتعامل مع عدة اتصالات متزامنة
    والمشكلة التي واجهتني في الدالة accept لأن البرنامج يتوقف عند هذه الدالة حتى يتم استقبال اتصال ولن يتحرك قبل ذلك , وهذا سيعمل لنا مشاكل خصوصا أننا نتعامل مع عدة اتصالات متزامنة فلن يتم معالجة باقي طلبات من المستخدمين لأن البرنامج متوقف عند هذه الدالة

    وأيضا توجد دالة أخرى هي recv و هي تستخدم لإستقبال الرسائل من المستخدمين وهي مستخدمة في برنامج Server وايضا في برنامج Client مما يجعل المشكلة مشتركة في البرنامجين
    لأن عند هذه الدالة يتوقف البرنامج حتى يستقبل البيانات المرسلة وقبل ذلك لن يتحرك البرنامج ولن يعالج باقي الطلبات

    الحقيقة أن الحل موجود من خلال عمل thread لكل من الدالتين لكن ستستخدم thread للدالة recv فقط
    أما accept فلن نجعلها داخل thread لأننا نحتاج هذه الدلة في إبقاء البرنامج السيرفور شغال ولن يتوقف خصوصا أن برنامج السيرفور سيعمل بدون واجهة رسومية وبالتالي سنحتفظ بالدالة في حلقة ممتكررة وأي اتصال جديد نستقبله نضعه في thread مثل الكود التالي :

    كود PHP:
        while(1)
        {
            
    new_socket accept(create_socket,(struct sockaddr *)&address,&addrlen);
               
    pthread_t Begin_th;
            
    pthread_create(&Begin_thNULLconnectsocket,new_socket);
           } 
    المهم إليكم صور البرنامج
    اضغط على الصورة لعرض أكبر. 

الإسم:	01.png 
مشاهدات:	1 
الحجم:	12.2 كيلوبايت 
الهوية:	850123

    اضغط على الصورة لعرض أكبر. 

الإسم:	02.png 
مشاهدات:	1 
الحجم:	33.3 كيلوبايت 
الهوية:	850122

    الكود السورس موجود في المرفقات
    source.tar.gz


  • #2
    نسيت أذكر لتصنيف الكود فك ضغط الملفات وادخل على الترمنيل وأدخل على مسار الملفات soure وأكتب الامر التالى
    كود PHP:
    make clean
    make 
    ثم شغل البرنامج بالامر التالي :
    كود PHP:
    ./chat-test 

    تعليق


    • #3
      برنامج جميل، يستحق التطوير

      تعليق


      • #4
        عندما يقوم احد ما بارسال رسالة خلال هذا البرنامج، وعندما يتم استقبالها يقوم البرنامج بافراغ مربع الكتابة، تم تجاوز هذه المشكلة في هذه النسخة
        http://www.sendspace.com/file/2o911h

        اصلحه اخونا bouhssini

        تعليق


        • #5
          واجهتني في الدالة accept لأن البرنامج يتوقف عند هذه الدالة حتى يتم استقبال اتصال ولن يتحرك قبل ذلك
          هل سمعت عن دالة select ؟
          http://cltb.ojuba.org/ar/libc.html#20

          الحقيقة أن الحل موجود من خلال عمل thread لكل من الدالتين لكن ستستخدم thread للدالة recv فقط
          قد لا تكون بحاجة إلى threads

          تعليق


          • #6
            شكرا للأخ boussouira على تفاعله
            وشكرا للأستاذ مؤيد السعدي على المعلومات القيمة , لطالما استفذنا منك كثرا
            وشكرا لكل من مر على الموضوع , وبالنسبة للإخوة الذين طلبو مني المشروع gambas2 أقول لهم أبشروا
            سأرفعه قريبا بإذن الله

            تعليق


            • #7
              هذه بعضالتعديلات على البرنامج
              * تم تفاذي تغراث BOF
              * تم اضافة ملفات code::blocks لتسهيل عملية التطوير
              اضن ان السيرفور سيحتاج الى بعض التعديلات ايضا

              http://www.sendspace.com/file/l5hojp

              تعليق


              • #8
                شكرا أخانا الحبيب boussouira على التعديل
                لقد اعتمدت التعديلات الجديدة التي أضفت ووضعتها في الرابط هنا
                http://sourceforge.net/projects/chatbouhssini/files/


                تعليق


                • #9
                  يجب ان تستخدم برنامج git
                  http://ojuba.org/wiki/docs/git_tutorial

                  تعليق


                  • #10
                    هذا الكود الخاص بالسيرفور

                    بسم الله الرحمن الرحيم
                    كنت وعدت الاخوة برفع الكود الخاص بالسيرفور , وها أنا أفي بالوعد وأضع لكم الكود أتمنى من الاخ boussouira
                    أن يكتب ملف Makefile للبرنامج السيرفور لأني مشغول قليل
                    الكود ستجدوه في المرفقات هنا server.tar.gz

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

                    تعليق


                    • #11
                      مشروع المحادثة الجماعي بلغة Gambas2 كما وعدت الإخوة

                      السلام عليكم ورحمة الله
                      أولا أنا أسف على تأخير نظرا لأشغال الدنيا , وكما وعدت الاخوة , فقد تسنى لي تعديل الكود خاص بـ Gambas2 ليكون سهل وتتم بيه الفائذة ويستفيذ الاخوة

                      بالنسبة لبرنامج السيرفور فهو لا يعتمد على الواجهة الرسومية بل يشتغل في بيئة Console وهذا هو الكود :
                      كود PHP:
                        Gambas module file
                      PRIVATE Client AS Object[]
                      PRIVATE 
                      ServerSck AS ServerSocket
                      CONST PortSrv AS Integer 5001

                      PUBLIC SUB Main()
                        
                      Client = NEW Object[]
                        
                      ServerSck = NEW ServerSocket AS "ServerSck"
                        
                      ServerSck.Port PortSrv
                        ServerSck
                      .Type Net.Internet
                        ServerSck
                      .Listen
                        
                      PRINT "Listen : " PortSrv
                        WAIT 0.1
                      END

                      PUBLIC SUB ServerSck_Connection(RemoteHostIP AS String)
                        
                      DIM sBuf AS String
                        DIM Obj 
                      AS Object
                        DIM ky 
                      AS String
                        DIM S 
                      AS String
                        DIM index 
                      AS Integer

                        Obj 
                      ServerSck.Accept()
                        
                      ky Obj.RemoteHost ":" Obj.RemotePort
                        Client
                      .Add(Obj)
                        
                      sBuf "عدد المتواجدين بما فيهم أنت : " Client.Count
                        SendDataAll
                      (Client.Find(Obj), sBufFALSE)
                      END

                      PUBLIC SUB ServerSck_Error()
                          PRINT 
                      "Error : Port " PortSrv " déja open"
                          
                      QUIT
                      END

                      PUBLIC SUB Socket_Read()
                       
                      DIM txt AS String
                       READ 
                      #LAST, txt, Lof(LAST)
                       
                      SendDataAll(Client.Find(LAST), txtTRUE)
                      END

                      PUBLIC SUB Socket_Closed()
                        
                      CloseSocket(Client.Find(LAST))
                      END

                      PUBLIC SUB Socket_Error()
                        
                      CloseSocket(Client.Find(LAST))
                      END

                      PUBLIC SUB CloseSocket(index AS Integer)
                        
                      DIM sBuf AS String
                        
                      IF index >= 0 THEN
                          sBuf 
                      "Close : " Client[index].RemoteHost ":" Client[index].RemotePort
                          SendDataAll
                      (indexsBuf)
                          
                      Client[index].close
                          Client
                      .Remove(index)
                        ENDIF
                      END

                      PUBLIC SUB SendDataAll(index AS Integertxt AS StringAS Boolean)
                        
                      DIM i AS Integer
                        
                      FOR 0 TO (Client.Count 1)
                            IF 
                      <> index AND B THEN 
                              WRITE 
                      #Client[i], txt, Len(txt)
                            
                      END IF
                        
                      NEXT
                      END 
                      أما برنامج Client فهو يعتمد على مكتبة Qt وإليكم الصورة ثم بعدها الكود
                      اضغط على الصورة لعرض أكبر. 

الإسم:	Screenshot.png 
مشاهدات:	1 
الحجم:	8.7 كيلوبايت 
الهوية:	835369
                      كود PHP:
                        Gambas class file
                      PUBLIC MySock AS Socket

                      PUBLIC SUB _new()
                          
                      MySock = NEW Socket AS "MySock"
                      END

                      PUBLIC SUB Form_Open()
                        
                      ME.Center
                      END

                      PUBLIC SUB Button1_Click()
                        
                      MySock.Connect(T2.TextT3.Text)
                        
                      Button1.Enabled FALSE
                        T2
                      .Enabled FALSE
                        T3
                      .Enabled FALSE

                        
                      DO WHILE (MySock.Status <> 7) AND (MySock.Status 0) AND (MySock.Status <> 6
                          
                      WAIT 0.1
                        LOOP

                        
                      IF MySock.Status <> 7 THEN
                            Message
                      .Error("لقد فشل الاتصال حاول من جديد")
                            
                      Button1.Enabled TRUE
                            T2
                      .Enabled TRUE
                            T3
                      .Enabled TRUE
                        
                      ELSE 
                          
                      Message.Error("تم الاتصال بنجاح")
                        
                      END IF

                      END

                      PUBLIC SUB Button3_Click()
                        
                      CloseSocket()
                      END

                      PUBLIC SUB MySock_Read()
                       
                      DIM txt AS String
                       READ 
                      #LAST, txt, Lof(LAST)
                       
                      Display(txt)
                      END

                      PUBLIC SUB MySock_Closed()
                        
                      CloseSocket()
                      END

                      PUBLIC SUB MySock_Error()
                        
                      CloseSocket()
                      END

                      PUBLIC SUB CloseSocket()
                        
                      MySock.Close()
                        
                      Button1.Enabled TRUE
                        T2
                      .Enabled TRUE
                        T3
                      .Enabled TRUE
                      END

                      PUBLIC SUB Display(txt AS String)
                        
                      T1.Insert(txt "\n")
                      END

                      PUBLIC SUB Sendtxt()
                        
                      DIM txt AS String
                        txt 
                      T4.Text
                        WRITE 
                      #MySock, txt, Len(txt)
                        
                      T4.Clear
                      END

                      PUBLIC SUB Button2_Click()
                          
                      Sendtxt()
                      END

                      PUBLIC SUB T4_Activate()
                        
                      Sendtxt()
                      END 
                      المشروع موجود في المرفقات لكل من Client و Server
                      الملفات المرفقة

                      تعليق


                      • #12
                        لقد تم اعادة كتابة السيرفور وجزء من برنامج client وهذه اهم الاضافات:
                        * امكانية استخدام الاوامر كما في IRC مثلا للحصول على لائحة المتصلين نكتب
                        كود:
                        /LIST
                        لتغيير اسم المستخدم نكتب
                        كود:
                        /NICK name
                        * البرنامج يخبر المتصليين ان دخل او خرج احد ما من الشات
                        هذا هو client
                        http://www.sendspace.com/file/lfs7pn
                        وهذا السيرفور
                        http://www.sendspace.com/file/7fm2p7
                        واجهتني مشكلة مع السيرفور، عند تشغيله على موقع يدعم exec لا يتم الاتصال(لا يفيتح المنفذ) مع أن السيرفور الذي رفعته يمكنه الاتصال، وجربت سيرفورا اخر واشتغل، لا أدري ما المشكلة مع هذا السيرفور

                        تعليق


                        • #13
                          ممتاز أخي لو ترفع التغييرات على موقع آخر لان هذا الموقع محجوب

                          تعليق


                          • #14
                            بسم الله الرحمن الرحيم

                            المشاركة الأصلية بواسطة عبدالله الصبي مشاهدة المشاركة
                            ممتاز أخي لو ترفع التغييرات على موقع آخر لان هذا الموقع محجوب
                            بالمرفقات ،
                            لكن أين أنت يا عبد الله ؟؟
                            الملفات المرفقة
                            (لَا تَحْسَبَنَّ الَّذِينَ يَفْرَحُونَ بِمَا أَتَوا وَّيُحِبُّونَ أَن يُحْمَدُوا بِمَا لَمْ يَفْعَلُوا فَلَا تَحْسَبَنَّهُم بِمَفَازَةٍ مِّنَ الْعَذَابِ وَلَهُمْ عَذَابٌ أَلِيمٌ)
                            آل عمران 188
                            قال رسول الله صلى الله عليه و سلم :
                            {لا يشكر الله من لا يشكر الناس}
                            {من كان يؤمن بالله واليوم الآخر،فليقل خيراً أو ليصمت}

                            جميع المساهمات الحاملة لهذا التوقيع تخضع لرخصة وقف
                            أسأل الله العظيم رب العرش العظيم أن يحسن من حال أمتي

                            تعليق


                            • #15
                              المشاركة الأصلية بواسطة مصعب الزعبي مشاهدة المشاركة
                              [CENTER][B]
                              لكن أين أنت يا عبد الله ؟؟

                              شكرا مصعب ما قصدته البرنامج المكتوب بالجامباس (إن كان هو المرفوع على موقع sendto)

                              (السعودية)

                              تعليق

                              يعمل...
                              X