hallo
ich hab ne frage wegen sockets.. ich bau ne verbindung zu nem irc server über TcpClient auf und bekomm dann auch ne antwort, aber nich alle antworten.
// ich versuch das über ne klasse zu machen
// _tcpclient is nen TcpClient
// _tcpread nen NetworkStream
_tcpclient = new TcpClient();
_tcpclient.Connect(_ircadress, _ircport);
_tcpread = _tcpclient.GetStream();
byte[] bytes = new byte[_tcpclient.ReceiveBufferSize];
_tcpread.Read(bytes, 0, (int)_tcpclient.ReceiveBufferSize);
string returndata = Encoding.UTF8.GetString(bytes);
statuswindow.Text = statuswindow.Text + returndata;
// das read hab ich mir aus der msdn library rausgesucht
was ich bekomm:
NOTICE AUTH 😗** Looking up your hostname
was ich bekommen sollte:
NOTICE AUTH 😗** Looking up your hostname
NOTICE AUTH 😗** Found your hostname, cached
NOTICE AUTH 😗** Checking Ident < und dann müsste ich die erste antwort senden
wie bekomm ich alle messages vom server?
btw das irc protokoll an sich is mir bekannt, hab das auch schonma in delphi gemacht (dort gabs nen event das immer getriggert ist, wenn ne message vom server kam, ich weiß halt nich wie das in c# funktioniert 🙁 )
wäre nett wenn mir das wer erklären könnte bzw mir hilfreiche links (tutorials zu dem thema geben könnte (das forum hier hab ich auch schon durchsucht aber nix hilfreiches gefunden))
If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.
heeeelp 🙁 (les grad mein thread und könnte etwas missverständlich sein) ich such nen weg connected zu bleiben bzw wie geh ich sicher dass ich alle messages vom server kriege die er mir sendet
If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.
so das is zwar schon ne ganze weile her, aber ich hab mich erst seit gestern wieder damit befasst und nun auch ne lösung gefunden.
ich poste hier einfach mal den code, da ich mir gut vorstellen kann, dass es noch mehrere leute mit diesem problem geben wird.
#region IRCCONNECTION
private Socket client;
private byte[] data = new byte[4096];
private delegate void Addmsgs(string msg);
private event Addmsgs Addmsg;
public void ircconnect()
{
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("194.159.164.211"), 6668); //in diesem fall ein uk server
newsock.Blocking = false;
newsock.BeginConnect(iep, new AsyncCallback(OnConnect), newsock);
}
public void OnConnect(IAsyncResult ar)
{
client = (Socket)ar.AsyncState;
try
{
client.EndConnect(ar);
client.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), client);
}
catch (Exception)
{
MessageBox.Show("Es konnte keine Verbindung aufgebaut werden.", "Verbindungsfehler");
}
}
public void OnReceive(IAsyncResult ar)
{
try
{
Socket remote = (Socket)ar.AsyncState;
int recv = remote.EndReceive(ar);
string receiveddata = Encoding.ASCII.GetString(data, 0, recv);
Invoke(Addmsg, new string[] { receiveddata });
remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void OnSend(IAsyncResult ar)
{
try
{
Socket remote = (Socket)ar.AsyncState;
int sent = remote.EndSend(ar);
remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void IRCCommand(string msg)
{
richTextBox1.Text = richTextBox1.Text + msg + "\nNEU\n";
if (Regex.IsMatch(msg, @"NOTICE AUTH \:\*\*\* Checking Ident"))
{
string send = "USER TESTER * * :nreal anyname\r\nNICK anyname\r\n";
byte[] bytes = Encoding.ASCII.GetBytes(send);
client.BeginSend(bytes, 0, bytes.Length, SocketFlags.None, new AsyncCallback(OnSend), client);
}
else if (Regex.IsMatch(msg, @"^PING :(\d+)"))
{
Match m = Regex.Match(msg, @"(\d+)");
if (m.Success)
{
byte[] bytes = Encoding.ASCII.GetBytes("PONG :"+m.Value+"\r\n");
client.BeginSend(bytes, 0, bytes.Length, SocketFlags.None, new AsyncCallback(OnSend), client);
}
}
}
#endregion
mit ircconnect(); startet die ganze sache. auf ner form sollte es eine richtextbox1 geben.
ins form1() muss noch
Addmsg = new Addmsgs(IRCCommand);
rein.
weitere commands senden:
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "")
{
byte[] bytes = Encoding.ASCII.GetBytes(textBox1.Text+"\r\n");
client.BeginSend(bytes, 0, bytes.Length, SocketFlags.None, new AsyncCallback(OnSend), client);
}
}
mfg
ps: falls wer was an dem code zu meckern hat, kann gerne verbesserungsvorschläge machen ;D
If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.