Send a message between the client (Socket UDP)

I am new to C # and I am involved in Socket programming.

First, I created a server to connect a client to it.

Server:

class Program { static void Main(string[] args) { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 1900); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); newsock.Bind(ipep); Console.WriteLine("Waiting for a client..."); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint Remote = (EndPoint)(sender); recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine("Message received from {0}:", Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); string welcome = "Welcome to my test server"; data = Encoding.ASCII.GetBytes(welcome); newsock.SendTo(data, data.Length, SocketFlags.None, Remote); while (true) { data = new byte[1024]; recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); newsock.SendTo(data, recv, SocketFlags.None, Remote); } } } 

Customer:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; namespace serverUDPWF { public partial class ServerForm : Form { byte[] data = new byte[30]; string input = ""; string stringData = ""; IPEndPoint iep,sender; Socket server; string welcome = ""; int recv; EndPoint tmpRemote; public ServerForm() { InitializeComponent(); startServer(); } public void startServer() { iep = new IPEndPoint( IPAddress.Parse("127.0.0.1"), 1900); server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); welcome = "Hello, are you there?"; data = Encoding.ASCII.GetBytes(welcome); server.SendTo(data, data.Length, SocketFlags.None, iep); sender = new IPEndPoint(IPAddress.Any, 0); tmpRemote = (EndPoint)sender; data = new byte[30]; recv = server.ReceiveFrom(data, ref tmpRemote); Console.WriteLine(); listBox1.Items.Add("Message received from {0}:" + tmpRemote.ToString()); listBox1.Items.Add(Encoding.ASCII.GetString(data, 0, recv)); } private void sendMessageToserver(object sender, EventArgs e) { if (textBox2.Text == "") { MessageBox.Show("Please Enter Your Name"); } else { int i = 30; input = textBox2.Text + ": " + textBox1.Text; if (input == "exit") { this.Close(); } server.SendTo(Encoding.ASCII.GetBytes(input), tmpRemote); textBox1.Text = ""; data = new byte[i]; try { recv = server.ReceiveFrom(data, ref tmpRemote); stringData = Encoding.ASCII.GetString(data, 0, recv); listBox1.Items.Add(stringData); } catch (SocketException) { listBox1.Items.Add("WARNING: data lost, retry message."); i += 10; } } } } } 

My problem is how to make the client not enter the server IP address, for example 127.0.0.1. My second problem is that I open 2 clients at the same time, but client A sends a message to the server, but client B does not receive a message from client A (I want to send a message like broadcast)

How can i do this?

+4
source share
1 answer

Udp multicast .. I'm just trying, if something is wrong, feel free to share

Customer:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Collections; using System.Threading; namespace Myclient { public partial class Form1 : Form { public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } Socketsending socketsending; string multicastIP = string.Empty; int multicastPort = 0; int clientPort = 0; string clientSysname = string.Empty; string Nodeid = string.Empty; string clientIP = string.Empty; string recievedText = string.Empty; string sendingText = string.Empty; IPAddress ipAddress; IPEndPoint ipEndpoint; UdpClient udpClient; string[] splitRecievedText; byte[] byteRecieve; private void Form1_Load(object sender, EventArgs e) { Random _random = new Random(); multicastIP = "224.5.6.7"; multicastPort = 5000; Nodeid = "node" + _random.Next(1000, 9999); clientPort = _random.Next(1000, 9999); clientSysname = Dns.GetHostName(); ipAddress = Dns.GetHostEntry(clientSysname).AddressList.FirstOrDefault (addr => addr.AddressFamily.Equals(AddressFamily.InterNetwork)); ipEndpoint = new IPEndPoint(ipAddress, clientPort); clientIP = ipAddress.ToString(); label1.Text = "Node id: " + Nodeid; label2.Text = "Host Name: " + clientSysname; Thread threadMain = new Thread(connect); threadMain.Start(); threadMain = new Thread(receive); threadMain.Start(); } void connect() { socketsending = new Socketsending(); sendingText = " connect@ " + clientSysname + "#" + clientIP + "#" + clientPort + "#" + Nodeid + "#"; socketsending.send(multicastIP, multicastPort, sendingText); } void receive() { udpClient = new UdpClient(clientPort); while (true) { IPEndPoint _ipendpoint = null; byteRecieve = udpClient.Receive(ref _ipendpoint); recievedText = Encoding.ASCII.GetString(byteRecieve); splitRecievedText = recievedText.Split('@'); if (splitRecievedText[0] == "stop") { } } } private void button1_Click(object sender, EventArgs e) { sendingText = " message@ " + Nodeid + '$' + textBox1.Text + '$'; socketsending.send(multicastIP, multicastPort, sendingText); } } } 

Server:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; using System.Collections; namespace Myserver { public partial class Form1 : Form { public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } string multicastip = string.Empty; string serversystemname = string.Empty; string receiveddata = string.Empty; string nodeinfo = string.Empty; string clientHostName = string.Empty; string clientIP = string.Empty; string Nodeid = string.Empty; int multicastport = 0; int clientport = 0; DataTable datatable; DataTable dataTableAddRemove; string[] splitReceived; string[] splitnodeinfo; Socket socket; IPAddress ipaddress; IPEndPoint ipendpoint; byte[] bytereceive; Dictionary<string, string> dictionarytable; public delegate void updategrid(); private void Form1_Load(object sender, EventArgs e) { multicastip = "224.5.6.7"; multicastport = 5000; serversystemname = Dns.GetHostName(); datatable = new DataTable(); datatable.Columns.Add("HostName"); datatable.Columns.Add("Nodeid"); datatable.Columns.Add("ipaddress"); datatable.Columns.Add("portnumber"); DGV.DataSource = datatable; Thread threadreceive = new Thread(receiver); threadreceive.Start(); } void receiver() { dictionarytable = new Dictionary<string, string>(); socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ipendpoint = new IPEndPoint(IPAddress.Any, multicastport); socket.Bind(ipendpoint); ipaddress = IPAddress.Parse(multicastip); socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ipaddress, IPAddress.Any)); while (true) { bytereceive = new byte[4200]; socket.Receive(bytereceive); receiveddata = Encoding.ASCII.GetString(bytereceive, 0, bytereceive.Length); splitReceived = receiveddata.Split('@'); if (splitReceived[0].ToString() == "connect") { nodeinfo = splitReceived[1].ToString(); connect(); } else if (splitReceived[0].ToString() == "Disconnect") { nodeinfo = splitReceived[1].ToString(); Thread threadDisconnect = new Thread(disconnect); threadDisconnect.Start(); } else if (splitReceived[0].ToString() == "message") { string[] str = splitReceived[1].Split('$'); listBox1.Items.Add(str[0] + " -> " + str[1]); } } } void connect() { SocketSending socketsending = new SocketSending(); int count = 0; splitnodeinfo = nodeinfo.Split('#'); clientHostName = splitnodeinfo[0].ToString(); clientIP = splitnodeinfo[1].ToString(); clientport = Convert.ToInt32(splitnodeinfo[2].ToString()); Nodeid = splitnodeinfo[3].ToString(); if (!dictionarytable.ContainsKey(Nodeid)) { count++; dictionarytable.Add(Nodeid, clientIP + "#" + clientport + "#" + clientHostName); dataTableAddRemove = (DataTable)DGV.DataSource; DataRow dr = dataTableAddRemove.NewRow(); dr["Nodeid"] = Nodeid; dr["HostName"] = clientHostName; dr["IPAddress"] = clientIP; dr["portNumber"] = clientport; dataTableAddRemove.Rows.Add(dr); datatable = dataTableAddRemove; updatenodegrid(); } } void disconnect() { SocketSending socketsending = new SocketSending(); string removeClient = string.Empty; splitnodeinfo = nodeinfo.Split('#'); clientHostName = splitnodeinfo[0].ToString(); Nodeid = splitnodeinfo[1].ToString(); dataTableAddRemove = (DataTable)DGV.DataSource; DataRow[] arrayDataRow = dataTableAddRemove.Select(); for (int i = 0; i < arrayDataRow.Length; i++) { string matchGridHostName = arrayDataRow[i]["HostName"].ToString(); if (clientHostName == matchGridHostName) { Thread.Sleep(100); removeClient = clientHostName; arrayDataRow[i].Delete(); break; } } if (dictionarytable.ContainsKey(removeClient)) { dictionarytable.Remove(removeClient); } } void updatenodegrid() { if (this.DGV.InvokeRequired) this.DGV.Invoke(new updategrid(updatenodegrid)); else DGV.DataSource = datatable; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { dictionarytable.Clear(); } } } 
0
source

Source: https://habr.com/ru/post/1396449/


All Articles