logo

برمجة المقبس في C/C++

في عالم اليوم، تلعب شبكات الكمبيوتر دورًا مهمًا في مجال نقل البيانات. وهو موضوع يجب أن يعرفه كل مبرمج. في ظل شبكة الكمبيوتر تعتبر برمجة المقبس من أهم المواضيع في عالم البرمجة. سنتحدث في هذا الموضوع عن برمجة المقبس والطرق المختلفة لبرمجة المقبس التي يتم تنفيذها في لغة C++.

في لغة C++، تعد برمجة المقبس طريقة تجمع بين عقدتين أو أكثر مع بعضها البعض عبر شبكة بحيث تتمكن العقد من مشاركة البيانات دون أي فقدان للبيانات. وفي هذا الصدد، تستمع عقدة واحدة إلى منفذ واحد متصل بعنوان IP معين. عندما يصل العميل إلى الخادم، يقوم الخادم بإنشاء مستمع المقبس.

ما هو المقبس؟

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

فرز فقاعة جافا

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

برمجة المقبس في C/C++

الإجراء في الاتصال بين العميل والخادم

هناك بعض الإجراءات التي يتعين علينا اتباعها لإنشاء اتصال بين العميل والخادم. هذه هي كما يلي.

    قابس كهرباء:بمساعدة المقبس، يمكننا إنشاء اتصال جديد.ربط:بمساعدة هذا يمكننا إرفاق العنوان المحلي بالمقبس.يستمع:بهذه المساعدة؛ يمكننا قبول الاتصال.يقبل:بهذه المساعدة؛ يمكننا حظر الاتصال الوارد حتى وصول الطلب.يتصل:بهذه المساعدة؛ يمكننا محاولة تأسيس الاتصال.يرسل:بمساعدة هذا؛ يمكننا إرسال البيانات عبر الشبكة.يستلم:بهذه المساعدة؛ يمكننا تلقي البيانات عبر الشبكة.يغلق:بمساعدة هذا، يمكننا تحرير الاتصال من الشبكة.

مراحل إنشاء مقبس الخادم

هناك بعض المراحل التي يمكننا من خلالها إنشاء المقبس للخادم. هذه هي كما يلي.

    مقبس كثافة العمليات:المقبس (المجال، النوع، البروتوكول)المقبسكر:إنه نوع صحيح، وهو مثل معالج الملفات.اِختِصاص:إنه مجال اتصال وهو نوع صحيح.يكتب:إنه نوع من الاتصالات.SOCK_DGRAM:إنه نوع من UDP غير موثوق به وغير متصل.بروتوكول:يتم استخدامه لتعيين قيمة البروتوكول لعنوان IP، وهي 0. وتشبه قيمة البروتوكول القيمة التي تظهر في حقل البروتوكول الخاص برأس IP الخاص بالجيب.

ما هو الاتصال؟

الاتصال هو نوع من العلاقة بين جهازين حيث يكون البرنامجان معروفين عن بعضهما البعض. يعرف هذان البرنامجان كيفية إنشاء اتصال مع بعضهما البعض؛ بمعنى آخر، يمكننا القول أن هذين البرنامجين يعرفان كيفية إرسال البتات عبر الشبكة. ويعني اتصال المقبس أن الجهازين يجب أن يعرفا جميع المعلومات فيما بينهما، مثل رقم الهاتف وعنوان IP ومنفذ TCP.

قم بتشغيل جافا

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

يمكن للخادم إنشاء المقبس بمساعدة المقبس (). لا يمكن مشاركة هذا المقبس مع أي معالج آخر.

    سيتسوكوبت:بمساعدة Setsockopt، يمكننا التعامل مع الخيارات المتنوعة للمقبس، والتي يشار إليها بواسطة واصف ملف المقبس. هذه العملية اختيارية تمامًا. بمساعدة Setsockopt، يمكننا إعادة استخدام المنفذ وعنوان العميل والخادم. عندما يعطي الخادم الخطأ 'العنوان قيد الاستخدام بالفعل'، يمكننا منعه بمساعدة Setsockopt.ربط:يمكننا ربط المقبس بالعنوان والمنفذ بمساعدة وظيفة الربط. تتم هذه العملية بعد إنشاء المقبس. على سبيل المثال، إذا حاولنا ربط الخادم بالمضيف المحلي، فإننا نستخدم INADDR_ANY لتحديد عنوان IP الخاص بالخادم.يستمع:يمكننا إنشاء مقبس وضع الاتصال بمساعدة وظيفة الاستماع إلى (). مثال على مأخذ توصيل وضع الاتصال هو SOCK_STREAM. يمكن تعريف ذلك بواسطة وسيطة المقبس. يتم استخدام هذا لقبول الاتصال الوارد وتنفيذ عملية قائمة الانتظار للاتصال الوارد وتنفيذ تراكم الاتصال الوارد. عندما يطلب اتصال وارد من الخادم الإقرار، يتم وضع المقبس في الوضع السلبي. تشير معلمة backlog للخادم إلى حقيقة أنه لا يمكنه السماح بأكثر من اتصال واحد بالخادم في نفس الوقت. إذا حدث اتصال وارد وكانت قائمة الانتظار ممتلئة، فسيقدم الخادم الخطأ مع الإشارة إلى 'ECONNREFUSED'. بمساعدة الاستماع ()، يكون الاتصال الوارد معلقًا، وعندما تكون قائمة الانتظار فارغة، فإنه يستدعي كافة الاتصالات الواردة إلى الخادم.يقبل:بمساعدة استدعاء النظام Accept(); يمكننا أن نجعل المقبس القائم على الاتصال. بعض المقابس القائمة على الاتصال هي SOCK_STREAMan وSOCK_SEQPACKET. فهو يستخرج جميع الاتصالات الواردة التي تأتي أولاً ويسمح لطلبها بالانتقال إلى الخادم. القائمة المتصلة حديثًا غير قادرة على الاستماع بمساعدة وسيطة أخرى لإنشاء المقبس الجديد.

مراحل للعميل

    اتصال المقبس:إنها بالضبط نفس طريقة إنشاء الخادم.يتصل:يمكننا بدء الاتصال بالمقبس بمساعدة استدعاء النظام Connect(). إذا كانت معلمة المقبس من نوع SOCK_DGRAM، فيمكننا تعريف مخطط البيانات على أنه دائم بمساعدة الاتصال (). إذا كان المقبس من النوع SOCK_STREAM، فيمكننا محاولة إجراء اتصال آخر للخادم. بمساعدة وظيفة Connect()، يمكننا أيضًا إنشاء اتصال للجمعية الأجنبية. إذا كان المقبس غير مرتبط، فسيقوم النظام بتعيين القيمة الفريدة للاقتران المحلي. عندما يكتمل استدعاء النظام بنجاح، يكون المقبس جاهزًا لإرسال أو استقبال أي نوع من البيانات.إرسال استقبال:يمكن لوظائف الإرسال () وrecv () إجراء العملية أدناه.
  • المقبس الذي يمكن من خلاله توصيل البيانات مع بعضها البعض.
  • يمكن لمخزن التخزين المؤقت تخزين بيانات حول العنوان، مثل addr_of_data وaddr_of_buffer.
  • إنه يتعامل مع حجم المخزن المؤقت، مثل len_of_data و len_of_buffer.
  • إنه يتعامل مع العلم الذي يوضح كيفية إرسال البيانات.

خطوات تأسيس الاتصال في المقبس

يقوم بإنشاء اتصال بين العملاء المختلفين والخادم. ولكن يمكن لكل من العميل والخادم التعامل مع اتصال المقبس. يجب على كل عملية إنشاء اتصال للمقبس الخاص بها.

الخطوات المتبعة لإنشاء مأخذ توصيل على جانب العميل هي كما يلي:

  • يقوم بإنشاء مأخذ توصيل بمساعدة استدعاء النظام ()socket.
  • ثم يتعين علينا الاتصال بعنوان مأخذ التوصيل الخاص بالخادم بمساعدة استدعاء النظام ().
  • ثم يتعين علينا إرسال واستقبال البيانات. يمكننا القيام بذلك بطرق مختلفة. يمكننا القيام بوظيفة القراءة () والكتابة ().

الخطوات المتبعة لإنشاء مأخذ توصيل على جانب الخادم هي كما يلي:

كيفية الحصول على الرموز التعبيرية التفاح على الروبوت
  • يقوم أولاً بإنشاء مأخذ توصيل بمساعدة استدعاء نظام مأخذ التوصيل ().
  • ثم يقوم بربط المقبس بعنوان ما بمساعدة استدعاء النظام bind(). يتكون العنوان من رقم منفذ لمقبس الخادم الموجود في الجهاز المضيف.
  • ثم يستمع للاتصال بمساعدة استدعاء نظام الاستماع ().
  • ثم يقبل الخادم الاتصال الوارد بمساعدة استدعاء النظام Accept(). كما أنه يحظر جميع الأوامر الواردة حتى يتصل العميل بالخادم.
  • ثم تبدأ عملية إرسال واستقبال البيانات.

توصيل عملاء متعددين دون تعدد مؤشرات الترابط

هناك العديد من الأمثلة التي نرى فيها كيف يمكن لمستخدم واحد الاتصال بالخادم. في عالم البرمجة اليوم، يتصل العديد من المستخدمين بالخادم بمآخذ توصيل مختلفة.

هناك طرق مختلفة لتحقيق ذلك. واحد منهم هو تعدد الخيوط. بمساعدة تعدد العمليات، يمكننا تحقيق ذلك. يمكننا تنفيذ عملية تعدد مؤشرات الترابط بمساعدة وظيفة التحديد ().

مثال:

الكود الخاص بالعميل:

 // Client side C/C++ program to demonstrate Socket // programming #include #include #include #include #include #define PORT 8080 int main(int argc, char const* argv[]) { int sock = 0, valread, client_fd; struct sockaddr_in serv_addr; char* hello = &apos;Hello from client&apos;; char buffer[1024] = { 0 }; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0) 0 8080 { printf('
 socket creation error 
'); return -1; } serv_addr.sin_family="AF_INET;" serv_addr.sin_port="htons(PORT);" convert ipv4 and ipv6 addresses from text to binary form if (inet_pton(af_inet, '127.0.0.1', &serv_addr.sin_addr) <="0)" printf( '
invalid address not supported ((client_fd="connect(sock," (struct sockaddr*)&serv_addr, sizeof(serv_addr))) 0) printf('
connection failed send(sock, hello, strlen(hello), 0); printf('hello message sent
'); valread="read(sock," buffer, 1024); printf('%s
', buffer); closing the connected close(client_fd); 0; code for server: server side c c++ program demonstrate programming #include #define port int main(int argc, char const* argv[]) server_fd, new_socket, valread; struct sockaddr_in address; opt="1;" addrlen="sizeof(address);" buffer[1024]="{" }; char* hello="Hello from server" ; creating file descriptor ((server_fd="socket(AF_INET," sock_stream, 0)) perror('socket failed'); exit(exit_failure); forcefully attaching (setsockopt(server_fd, sol_socket, so_reuseaddr | so_reuseport, &opt, sizeof(opt))) perror('setsockopt'); address.sin_family="AF_INET;" address.sin_addr.s_addr="INADDR_ANY;" address.sin_port="htons(PORT);" (bind(server_fd, sockaddr*)&address, sizeof(address)) perror('bind (listen(server_fd, 3) perror('listen'); ((new_socket="accept(server_fd," (socklen_t*)&addrlen)) perror('accept'); send(new_socket, close(new_socket); listening shutdown(server_fd, shut_rdwr); pre> <p> <strong>Compiling:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-2.webp" alt="Socket Programming in C/C++"> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-3.webp" alt="Socket Programming in C/C++"> <h2>Uses of Socket Programming</h2> <p>Socket programs are used to communicate between various processes, usually running on different systems. It is mostly used to create a client-server environment. This post provides the various functions used to create the server and client program and an example program.</p> <p>In the example, the client program sends a file name to the server, and the server sends the contents of the file back to the client. Socket programming usually pertains to basic communication protocols like TCP/UDP and raw sockets like ICMP. These protocols have a small communication overhead when compared to underlying protocols such as HTTP/DHCP/SMTP etc.</p> <p> <strong>Some of the basic data communications between the client and server are:</strong> </p> <ul> <li>File Transfer: Sends name and gets a file.</li> <li>Web Page: Sends URL and gets a page.</li> <li>Echo: Sends a message and gets it back.</li> </ul> <h2>Disadvantages</h2> <ul> <li>C++ can establish communication only with the machine requested and not with any other machine on the network.</li> <li>Sockets allow only raw data to be sent. This means that the client and server need mechanisms to interpret the data.</li> </ul> <hr></0)>