วิธีการทำงานกับ Sockets ใน C #

การสื่อสารระหว่างกระบวนการคือความสามารถในการแลกเปลี่ยนข้อมูลระหว่างกระบวนการที่เชื่อมต่อตั้งแต่สองกระบวนการขึ้นไปและสามารถทำได้โดยใช้ซ็อกเก็ต หลังจากการเชื่อมต่อระหว่างเซิร์ฟเวอร์และไคลเอนต์กล่าวคือกระบวนการเซิร์ฟเวอร์และกระบวนการไคลเอ็นต์ถูกสร้างขึ้นพวกเขาสามารถสื่อสารเพื่อจุดประสงค์ในการแลกเปลี่ยนข้อมูลโดยใช้ซ็อกเก็ต

ซ็อกเก็ตเป็นจุดสิ้นสุดของการสื่อสารแบบสองทิศทางระหว่างสองกระบวนการที่ทำงานบนเครือข่าย คุณสามารถใช้เนมสเปซ System.Net และ System.Net.Sockets เพื่อทำงานกับซ็อกเก็ตใน C # ในขณะที่แบบเดิมใช้สำหรับการทำงานระดับสูงโดยใช้ซ็อกเก็ตส่วนหลังใช้สำหรับการทำงานระดับต่ำเมื่อทำงานกับซ็อกเก็ต

เมื่อทำงานกับซ็อกเก็ตคุณสามารถใช้กลไกการสื่อสาร TCP / IP (Transmission Control Protocol / Internet protocol) หรือ UDP / IP (User Datagram Protocol / Internet protocol) ในการแลกเปลี่ยนข้อมูลระหว่างสองกระบวนการหรือมากกว่าบนเครือข่ายคุณสามารถใช้ประโยชน์จากโปรโตคอลการขนส่ง TCP และ UDP แม้ว่า TCP (Transmission Control Protocol) จะเป็นโปรโตคอลที่เน้นการเชื่อมต่อที่ปลอดภัยและเชื่อถือได้ แต่ UDP (User Datagram Protocol) เป็นโปรโตคอลที่ค่อนข้างปลอดภัยหรือเชื่อถือได้รวดเร็วและไม่มีการเชื่อมต่อ

รายการรหัสต่อไปนี้แสดงให้เห็นว่าคุณสามารถใช้ประโยชน์จากคลาส 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

}

สามารถใช้วิธีการรับ () ของคลาสซ็อกเก็ตเพื่อรับข้อมูล นี่คือวิธีที่คุณสามารถใช้เพื่อดึงข้อมูลจากซ็อกเก็ต โปรดทราบว่าทั้งวิธีการส่งและรับกำลังบล็อกกล่าวคือจะบล็อกเธรดที่กำลังดำเนินการอยู่จนกว่าจะมีการส่งหรือรับข้อมูล

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

โปรดทราบว่าคุณควรรวมเนมสเปซ System.Net และ System.Net.Sockets ในโปรแกรมของคุณเพื่อทำงานกับซ็อกเก็ต

using System.Net;

using System.Net.Sockets;