כיצד לעבוד עם שקעים ב- C #

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

שקע הוא נקודת הסיום של תקשורת דו-כיוונית בין שני תהליכים העוברים ברשת. ניתן למנף את מרחבי השמות System.Net ו- System.Net.Sockets לעבודה עם שקעים ב- C #. בעוד שהראשון משמש לפעולות ברמה גבוהה באמצעות שקעים, האחרון משמש לכל פעולות ברמה נמוכה כאשר עובדים עם שקעים.

בעבודה עם שקעים ניתן להשתמש במנגנוני התקשורת TCP / IP (פרוטוקול בקרת שידור / פרוטוקול אינטרנט) או UDP / IP (פרוטוקול אינטרנט פרוטוקול משתמש / פרוטוקול אינטרנט). על מנת להחליף נתונים בין שני תהליכים או יותר ברשת, תוכלו לנצל את פרוטוקולי התחבורה TCP ו- UDP. בעוד ש- TCP (פרוטוקול בקרת שידור) הוא פרוטוקול מכוון לחיבור מאובטח ואמין, ה- UDP (פרוטוקול Datagram User) הוא פרוטוקול יחסית פחות מאובטח או אמין, מהיר וללא חיבור.

רישום הקוד הבא ממחיש כיצד תוכלו לנצל את מחלקת System.Net.Dns להצגת כתובת ה- IP של המערכת שלכם.

public static void Main(string[] args)

        {

            string hostName = Dns.GetHostName();

            try

            {

                IPAddress[] ipAddress = Dns.Resolve(hostName).AddressList;

                foreach (IPAddress address in ipAddress)

                    Console.WriteLine("{0}/{1}", hostName, address);

            }

            catch (Exception ex)

            {

                Console.WriteLine("Error occurred: "+ex.Message);

            }

            Console.Read();

        }

עיין ברישום הקוד לעיל. בעוד ששיטת Dns.GetHostName () מחזירה את שם המערכת, השיטה Dns.Resolve () משמשת לאחזור מערך מסוג IPHostEntry.

אחזור מידע ברשת

ניתן להשתמש במרחב השמות System.Net.NetworkInformation כדי לאחזר מטא נתונים של רשת (כלומר, שינויים ברשת, אירועי רשת, מאפיינים וכו ') ב- C #. לדוגמא, אם ברצונך לבדוק אם זמין חיבור רשת, תוכל להשתמש בשיטת GetIsNetworkAvailable () כמוצג להלן.

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable ();

כך תוכל לקרוא לשיטה זו בקוד שלך.

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable();

אם ברצונך לעקוב אחר השינויים בכתובת ה- IP תוכל להשתמש באירועים הבאים של מחלקת NetworkChange.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

כדי לאחזר את המידע על ממשקי הרשת תוכלו להשתמש בשיטת GetAllNetworkInterfaces () של המחלקה NetworkInterface.

NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

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

foreach (NetworkInterface networkInterface in networkInterfaces)

            {

                Console.WriteLine("Network ID :  " + networkInterface.Id);

                Console.WriteLine("Network Name :  " + networkInterface.Name);

                Console.WriteLine("Network Description\n:  " + networkInterface.Description);               

            }

הנה רשימת הקוד המלאה לעיונך.

static void Main(string[] args)

        {

            NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface networkInterface in networkInterfaces)

            {

                Console.WriteLine("Network ID  :  " + networkInterface.Id);

                Console.WriteLine("Network Name  :  " + networkInterface.Name);

                Console.WriteLine("Network Description  \n:  " + networkInterface.Description);               

            }

            Console.Read();

        }

תכנות שרת לקוח

כשעובדים עם תכנות רשת באמצעות TCP, בדרך כלל תצטרך ליצור תהליך שרת שאמור להתחיל ביציאה מסוימת וגם תהליך לקוח שיכול להתחיל בכל יציאה ולשלוח בקשת חיבור לשרת. תהליך השרת לאחר הפעלתו, מקשיב לבקשות חיבור נכנסות ביציאה בה הוא התחיל. קטע הקוד הבא ממחיש כיצד תוכלו לנצל את מחלקת System.Net.Sockets.TcpListener ולהשתמש בה בשילוב עם מחלקת השקעים.

TcpListener listener = new TcpListener(1234);

listener.Start();

Socket socket = listener.AcceptSocket();

Stream networkStream = new NetworkStream(socket);

קטע הקוד הבא ממחיש כיצד לקוח השקע שלך יכול להתחבר לשרת באמצעות פרוטוקול TCP.

String ipAddress = "specify the ip address here";

System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse(ipAddress);

System.Net.IPEndPoint remoteEndPoint = new IPEndPoint (ipAddress,9000);

socketClient.Connect (remoteEndPoint);

כדי לשלוח נתונים לשרת מהלקוח, אתה יכול להשתמש בקטע הקוד הבא.

try

{

  String text = "Hello World!";

  byte[] data = System.Text.Encoding.ASCII.GetBytes(text);

  socketClient.Send(data);

}

catch (SocketException se)

{

  //Write your exception handling code here

}

ניתן להשתמש בשיטת ה- Receive () של מחלקת השקעים לקבלת נתונים. כך תוכל להשתמש בו כדי לאחזר נתונים משקע. שים לב ששיטות השליחה והקבלה הן חסימות, כלומר, הם יחסמו את השרשור המבוצע עד אשר הנתונים נשלחים או מתקבלים.

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

שים לב שעליך לשלב בתוכנה את מרחבי השמות System.Net ו- System.Net.Sockets כדי לעבוד עם שקעים.

using System.Net;

using System.Net.Sockets;