Ich mache gerade einen Chat, der eine direkte UDP-Verbindung ist. Ich sah viele Vorschläge für TCP-Chat und einen dritten Computer (Server), aber das wollte ich nicht. Der Chat sollte nur lokal funktionieren, wie ich getestet habe und an großen Orten wie Schule, Arbeit oder anderen großartig sind.Empfange UDP-Daten von einem bestimmten Port, der an die richtextbox ausgegeben wird, während der Text c bleibt. C#
Bis jetzt habe ich es bekommen, UDP-Paket zu senden, wenn Sie Return in Textfeld, aber die Person, die ich es sende, naht nicht, um es in das Programm zu bekommen. Ich benutze Wireshark, um zu überprüfen, ob es wirklich zu ihm geht, und es tut es. Ich habe mehrere Google-Suchen und Tests versucht, aber nur Nähte, um Fehler zu bekommen, oder bekomme nichts zum Programm.
Was ich will, ist ein Übersetzer, der das UDP-Paket von bestimmten Port empfängt, und zeigt nur die Textdaten aus dem Paket. Ich möchte, dass es auf einem richTextBox2 Plus angezeigt wird, was bereits vorhanden ist.
Hier ist der Code, und ein paar Screenshots:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace chat
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// set this.FormBorderStyle to None here if needed
// if set to none, make sure you have a way to close the form!
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_NCHITTEST)
m.Result = (IntPtr)(HT_CAPTION);
}
private const int WM_NCHITTEST = 0x84;
private const int HT_CLIENT = 0x1;
private const int HT_CAPTION = 0x2;
private void pictureBox1_Click(object sender, EventArgs e)
{
colorDialog1.ShowDialog();
pictureBox1.BackColor = colorDialog1.Color;
this.BackColor = colorDialog1.Color;
}
private void button1_Click(object sender, EventArgs e)
{
}
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
string IpAddress = textBox3.Text;
IPAddress serverAddr = IPAddress.Parse(IpAddress);
IPEndPoint endPoint = new IPEndPoint(serverAddr, 2522);
string text = textBox4.Text + ": " + richTextBox1.Text;
byte[] send_buffer = Encoding.ASCII.GetBytes(text);
sock.SendTo(send_buffer, endPoint);
richTextBox2.Text = richTextBox2.Text + Environment.NewLine + textBox4.Text + ": " + richTextBox1.Text;
richTextBox1.Text = "";
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
screenshots:
ich vor kurzem von Visual Basic C# sprang haben, und ich Ich bin irgendwie neu, um Sachen zu vernetzen. Vielen Dank, wenn Sie bereit sind zu helfen :)
Sie schließen sofort Buchse nach Daten becuase die Buchse in der Methode KeyDown gesendet wird deklariert wird. Keine gute Idee, denn der Socket könnte schließen, bevor die Daten tatsächlich empfangen werden. Der Socket wird entsorgt, wenn Sie von der KeyDown-Methode zurückkehren. – jdweng
Nun, Wireshark zeigt alles, und es gibt kein Problem, es zu senden, was auch immer – KrisPus
Wann tritt der Abschluss auf? Es sei denn, Sie sehen, dass die Nachricht tatsächlich empfangen wird, bedeutet nicht, dass die Nachricht tatsächlich an den Empfänger gelangt ist. Das Schließen kann tatsächlich vor der letzten Nachricht an den Empfänger gelangen. – jdweng