logo

תכנות Socket ב-C/C++

בעולם של היום, רשתות מחשבים ממלאות תפקיד חשוב בתחום העברת הנתונים. זה נושא שכל מתכנת צריך לדעת. תחת רשת המחשבים, תכנות socket הוא אחד הנושאים החשובים בעולם התכנות. בנושא זה, אנו עושים כדי לדון בתכנות socket ובשיטה השונה של תכנות socket המיושמת ב-C++.

ב-C++, תכנות socket היא שיטה המשלבת שני צמתים או יותר זה עם זה ברשת, כך שהצמתים יכולים לשתף את הנתונים ללא כל אובדן של הנתונים. בהקשר זה, צומת אחד מאזין ליציאה אחת שמחוברת לכתובת IP מסוימת. כאשר הלקוח מגיע לשרת, השרת יוצר את ה-socket listener.

מה זה שקע?

בואו נבין על השקע על ידי דיבור בדוגמה בזמן אמת. שקע הוא סוג של מדיום המספק חיבור בין שני מכשירים. השקע יכול להיות מטען טלפון המספק את החיבור בין השקע לטלפון או הטלפון והמחשב הנייד הזה. בעזרת שקע מחוברות אפליקציות שונות לרשת המקומית עם יציאות שונות. בכל פעם כאשר השקע נוצר, השרת מציין את התוכנית, ותוכנית זו מציינת את השקע ואת כתובת הדומיין.

השקע הוא סוג של מנגנון המשמש להחלפת נתונים בין תהליכים שונים. כאן תהליכים אלה קיימים במכשירים שונים או באותו מכשיר המחוברים דרך רשת. לאחר יצירת החיבור לשקע, ניתן לשלוח את הנתונים לשני הכיוונים וממשיכים עד שאחת מנקודות הקצה סוגרת את החיבור.

תכנות Socket ב-C/C++

נוהל בתקשורת לקוח-שרת

ישנם כמה נהלים שעלינו לבצע כדי ליצור תקשורת לקוח-שרת. אלה הם כדלקמן.

    שֶׁקַע:בעזרת שקע נוכל ליצור תקשורת חדשה.לִקְשׁוֹר:בעזרת זה אנחנו יכולים, אנחנו יכולים לצרף את הכתובת המקומית עם השקע.להקשיב:בעזרת זה; אנחנו יכולים לקבל את החיבור.לְקַבֵּל:בעזרת זה; אנו יכולים לחסום את החיבור הנכנס עד שהבקשה תגיע.לְחַבֵּר:בעזרת זה; אנחנו יכולים לנסות ליצור את החיבור.לִשְׁלוֹחַ:בעזרת זה; אנחנו יכולים לשלוח את הנתונים דרך הרשת.לְקַבֵּל:בעזרת זה; אנחנו יכולים לקבל את הנתונים דרך הרשת.סגור:בעזרת זה נוכל לשחרר את החיבור מהרשת.

שלבים ליצירת שקעי שרת

ישנם כמה שלבים שבהם נוכל ליצור את השקע עבור השרת. אלה הם כדלקמן.

    int socketcr:Socket (דומיין, סוג, פרוטוקול)Socketcr:זהו סוג של מספר שלם, והוא כמו מטפל בקבצים.תְחוּם:זה תחום תקשורת וזה סוג מספר שלם.סוּג:זה סוג של תקשורת.SOCK_DGRAM:זהו סוג של UDP שאינו אמין וחסר חיבור.נוהל:הוא משמש להקצאת ערך הפרוטוקול עבור כתובת ה-IP, שהוא 0. ערך הפרוטוקול דומה לערך המופיע בשדה הפרוטוקול של כותרת ה-IP של הכיס.

מה זה חיבור?

חיבור הוא סוג של קשר בין שני מכונות שבו שתי התוכנות ידועות זו על זו. שתי התוכנות הללו יודעות ליצור קשר זו עם זו; במילים אחרות, אנו יכולים לומר ששתי התוכנות הללו יודעות לשלוח את הביטים דרך הרשת. חיבור של השקע אומר ששתי המכונות אמורות לדעת את כל המידע ביניהן, כמו מספר הטלפון, כתובת ה-IP ויציאת ה-TCP.

android.process.acore ממשיך לעצור

שקע הוא סוג של אובייקט הדומה לקובץ המאפשר לתוכנית לקבל את החיבור הנכנס ולאפשר להם לשלוח או לקבל את החיבור הנכנס. כמו כן, זהו סוג של משאב המוקצה לתהליך של השרת.

אורך מחרוזת java

השרת יכול ליצור את ה-socket בעזרת ה-socket(). לא ניתן לשתף את השקע הזה עם אף מעבד אחר.

    Setsockopt:בעזרת Setsockopt נוכל לתפעל את האפשרויות השונות של השקע, אליהן מתייחסים מתאר הקובץ של השקע. תהליך זה הוא אופציונלי לחלוטין. בעזרת Setsockopt נוכל לעשות שימוש חוזר ביציאה ובכתובת של הלקוח והשרת. כאשר השרת נותן את השגיאה 'כתובת כבר בשימוש', נוכל למנוע אותה בעזרת Setsockopt.לִקְשׁוֹר:אנחנו יכולים לאגד את השקע עם הכתובת והפורט בעזרת פונקציית ה-bind. פעולה זו מתבצעת לאחר יצירת השקע. לדוגמה, אם אנחנו מנסים לאגד את השרת עם המארח המקומי, אז אנחנו משתמשים ב-INADDR_ANY כדי להגדיר את כתובת ה-IP של השרת.להקשיב:אנחנו יכולים ליצור שקע מצב חיבור בעזרת פונקציית ההאזנה ל-(). דוגמה לשקע מצב חיבור הוא SOCK_STREAM. ניתן להגדיר זאת על ידי הארגומנט socket. זה משמש כדי לקבל את החיבור הנכנס לבצע את פעולת התור עבור החיבור הנכנס, ולבצע את ה-backlog של החיבור הנכנס. כאשר חיבור נכנס מבקש מהשרת אישור, השקע מועבר למצב פסיבי. פרמטר ה-backlog של השרת מתייחס לעובדה שהוא לא יכול לאפשר יותר מחיבור אחד בכל פעם לשרת. אם חיבור נכנס כלשהו הגיע והתור מלא, השרת מספק את השגיאה עם חיווי של ' ECONNREFUSED'. בעזרת listen(), החיבור הנכנס נמצא בהמתנה, וכאשר התור ריק, הוא קורא לכל החיבורים הנכנסים לשרת.לְקַבֵּל:בעזרת accept() system call; אנחנו יכולים ליצור את השקע מבוסס החיבור. חלק מהשקעים המבוססים על חיבור הם SOCK_STREAMו-SOCK_SEQPACKET. הוא מחלץ את כל החיבורים הנכנסים שנכנסים ראשונים ומאפשר לבקשתם לעבור לשרת. הרשימה החדשה שהתחברה אינה מסוגלת להאזין בעזרת טיעון נוסף ליצירת השקע החדש.

שלבים ללקוח

    חיבור שקע:זה בדיוק כמו השיטה ליצירת השרת.לְחַבֵּר:אנו יכולים ליזום חיבור לשקע בעזרת קריאת מערכת connect() . אם הפרמטר של השקע הוא סוג של SOCK_DGRAM, אז נוכל להגדיר את ה-datagram כקבוע בעזרת connect(). אם השקע הוא מסוג SOCK_STREAM, נוכל לנסות ליצור חיבור נוסף עבור השרת. בעזרת הפונקציה connect() נוכל ליצור חיבור גם לאגודה הזרה. אם השקע אינו קשור, אזי המערכת מקצה את הערך הייחודי לאגודה המקומית. כאשר המערכת מתקשרת בהצלחה הושלמה, השקע מוכן לשלוח או לקבל כל סוג של נתונים.שלח קבל:הפונקציות send() ו- recv() יכולות לבצע את הפעולה שלהלן.
  • השקע שעליו ניתן לתקשר את הנתונים זה עם זה.
  • מאגר האחסון יכול לאחסן נתונים על הכתובת, כמו addr_of_data ו-adr_of_buffer.
  • הוא עוסק בגודל המאגר, כמו len_of_data ו-len_of_buffer.
  • זה עוסק בדגל שאומר איך הנתונים יישלחו.

שלבים ליצירת החיבור בשקע

זה יוצר חיבור בין הלקוחות השונים לבין השרת. אבל גם הלקוח וגם השרת יכולים להתמודד עם חיבור השקע. כל תהליך צריך ליצור חיבור לשקע משלו.

השלבים הכרוכים בהקמת שקע בצד הלקוח הם כדלקמן:

  • זה יוצר שקע בעזרת קריאת מערכת socket() .
  • לאחר מכן עלינו להתחבר לכתובת ה-socket של השרת בעזרת קריאת system() .
  • אז אנחנו צריכים לשלוח ולקבל את הנתונים. אנחנו יכולים לעשות זאת בדרכים שונות. אנחנו יכולים לעשות את הפונקציה read() ו-write().

השלבים הכרוכים בהקמת שקע בצד השרת הם כדלקמן:

  • תחילה הוא יוצר שקע בעזרת קריאת מערכת socket() .
  • לאחר מכן הוא קושר את השקע לכתובת בעזרת קריאת המערכת bind() . כתובת מורכבת ממספר יציאה עבור שקע השרת במחשב המארח.
  • לאחר מכן הוא מאזין לחיבור בעזרת שיחת המערכת ההקשבה () .
  • לאחר מכן השרת מקבל את החיבור הנכנס בעזרת קריאה למערכת accept() . זה גם חוסם את כל הפקודות הנכנסות עד שלקוח מחובר לשרת.
  • לאחר מכן מתחיל תהליך השליחה והקבלה של נתונים.

חיבור לקוחות מרובים ללא ריבוי הליכים

ישנן דוגמאות שונות שבהן אנו רואים כיצד משתמש בודד יכול להתחבר לשרת. בעולם התכנות של היום, מספר משתמשים מחוברים לשרת עם שקעים שונים.

ישנן דרכים שונות להשיג זאת. אחד מהם הוא ריבוי פתילים. בעזרת ריבוי השרשורים נוכל להשיג זאת. אנו יכולים ליישם תהליך ריבוי הליכים בעזרת הפונקציה select() .

דוגמא:

קוד ללקוח:

 // 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)>