C# listening

Programovacie jazyky, rady, poradňa...
tomsk
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 30 jan 2010, 17:16

C# listening

Príspevok od používateľa tomsk »

Ahojte :) mam na vas taku otazku ci by ste mi nevedeli prosim vas pomoct s jednym kodom... ide o to ze mam program, ktory cez ping posiela nejake pakety na urcitu IP adresu na urcity Port.... a ja by som potreboval program, ktory by pocuval vsetky prichadzajuce pakety z toho daneho portu a ich niekam vypisoval napriklad do richtextbox... vsetko viem spravit len mam problemy s tym scriptom co bude "pocuvat"



Dakujem :)
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# listening

Príspevok od používateľa pcsiete »

Aké protokoly používaš?
Ak myslíš ping ako ICMP echo, tak porty rovnako ako pripojenie neexistujú. Budeš potrebovať socket s ProtocolType.Icmp a SocketType.Raw, pričom v Echo Reply potrebuješ sám vytvoriť IP header. Ten nebude automaticky pridaný kvôli parametru ST.Raw.
tomsk
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 30 jan 2010, 17:16

Re: C# listening

Príspevok od používateľa tomsk »

no ja by som chcel urobit nieco ako keby "chat" a spravy by sa posielali cez port, rozmyslal som nad pingom, lebo vlastne ping je poslanie nejakych paketov (defaultne 32 bytov) tak som rozmyslal ze by som do tych paketov dal spravu, a druhy program by ju odchytil


na bazi peer to peer... cize bez servera
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: C# listening

Príspevok od používateľa axxis »

tomsk napísal:no ja by som chcel urobit nieco ako keby "chat" a spravy by sa posielali cez port, rozmyslal som nad pingom, lebo vlastne ping je poslanie nejakych paketov (defaultne 32 bytov) tak som rozmyslal ze by som do tych paketov dal spravu, a druhy program by ju odchytil


na bazi peer to peer... cize bez servera
nechapem co chces robit s tym pingom (ten ja na nieco uplne ine ako posielanie textovych sprav), ale to co hladas je Socket
tomsk
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 30 jan 2010, 17:16

Re: C# listening

Príspevok od používateľa tomsk »

no tak upravujem temu :) temou je teraz socket :) dakujem za vysvetlenie, ten ping bol len taky experiment ze co keby som zabalil do toho paketu spravu :D no tak ako odchytit soket a niekam ho zapisat? :)
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: C# listening

Príspevok od používateľa axxis »

tomsk napísal:no tak upravujem temu :) temou je teraz socket :) dakujem za vysvetlenie, ten ping bol len taky experiment ze co keby som zabalil do toho paketu spravu :D no tak ako odchytit soket a niekam ho zapisat? :)
Co mas ban na google?
Vsak napis do googlu .NET socket communication.
Socket je endpoint, ktory pocuva prichadzajuce data, nie je to packet ani ramec.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# listening

Príspevok od používateľa pcsiete »

Na serveri:

Kód: Vybrať všetko

/* vytvor socket, ktorý bude zachytávať prichádzajúce TCP dáta s IP adresovaním */
Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

/* nastav socket na prijímanie z:
	- ľubovoľnej adresy
	- na port 2789
*/
sck.Bind(new IPEndPoint(IPAddress.Any, 2789));

/* počúvaj */
sck.Listen(1);

/* počkaj a akceptuj prichádzajúce pripojenia */
Socket client;
while(true) {
	client = sck.Accept();
	
	/* komunikuj s klientom pomocou 'client' */
	...
}
U klienta:

Kód: Vybrať všetko

Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

/* pripoj sa na server */
sck.Connect(serverip, 2789);

/* komunikuj */
sck.Send(...);
Aj keď vytváraš P2P aplikáciu, stále potrebuješ niečo čo pripojenia prijíma a niečo čo sa pripája. Teda po zapnutí aplikácie môžeš vždy inicializovať prijímanie pripojení a dať užívateľovi aj možnosť pripojiť sa (čiže potebuješ osobitné thready).
tomsk
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 30 jan 2010, 17:16

Re: C# listening

Príspevok od používateľa tomsk »

tak ale myslim ze stacil by client-client, ze kazdy klient by mal funkciu aj na posielanie aj na pocuvanie, akurat ma zaujima ze ked klient nieco ziska tak ako zisti IP adresu kto to poslal? da sa to nejako zistit? alebo zahrniem IP adresu do spravy a potom si tu IP vytiahnem
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# listening

Príspevok od používateľa pcsiete »

tomsk napísal:tak ale myslim ze stacil by client-client, ze kazdy klient by mal funkciu aj na posielanie aj na pocuvanie
Aj keď vytváraš P2P aplikáciu, stále potrebuješ niečo čo pripojenia prijíma a niečo čo sa pripája. Teda po zapnutí aplikácie môžeš vždy inicializovať prijímanie pripojení a dať užívateľovi aj možnosť pripojiť sa (čiže potebuješ osobitné thready).
tomsk napísal: akurat ma zaujima ze ked klient nieco ziska tak ako zisti IP adresu kto to poslal? da sa to nejako zistit? alebo zahrniem IP adresu do spravy a potom si tu IP vytiahnem
Socket.RemoteEndPoint
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8219
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C# listening

Príspevok od používateľa harrison314 »

Ono v C# ide vytvorit P2P aplikaciu aj tak aby si sa vobec nemusel starat o sokety

http://www.paulrohde.com/building-a-rea ... plication/
tomsk
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 30 jan 2010, 17:16

Re: C# listening

Príspevok od používateľa tomsk »

Aj keď vytváraš P2P aplikáciu, stále potrebuješ niečo čo pripojenia prijíma a niečo čo sa pripája. Teda po zapnutí aplikácie môžeš vždy inicializovať prijímanie pripojení a dať užívateľovi aj možnosť pripojiť sa (čiže potebuješ osobitné thready).
Taky problem naprogramovat program ktory by bol klient a server sucastne???


harrison314 napísal:Ono v C# ide vytvorit P2P aplikaciu aj tak aby si sa vobec nemusel starat o sokety

http://www.paulrohde.com/building-a-rea ... plication/

skusim popozerat :D
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# listening

Príspevok od používateľa pcsiete »

harrison314 napísal:Ono v C# ide vytvorit P2P aplikaciu aj tak aby si sa vobec nemusel starat o sokety

http://www.paulrohde.com/building-a-rea ... plication/
... čím vyššie API použiješ, tým väčšie obmedzenia budeš musieť prekonávať. Sockety sú skoro jednotná univerzálna metóda IPC, pochopíš ich raz a budeš im rozumieť všade.
tomsk
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 30 jan 2010, 17:16

Re: C# listening

Príspevok od používateľa tomsk »

Caute tak som som skusil nieco nakodit, mozete sa prosim vas pozriet na tento kod? akurat mi tu vypisuje 3 chyby a neviem ako to opravit, tieto chyby som zakomentoval "//chyba", inac prosim vas mozete sa este pozriet ci by tento system spravne aj fungoval? lebo niesom si isty ze by to takto malo byt v poriadku :) ak som napisal blbost do toho kodu tak sa ospravedlnujem :)


inak stastne a vesele vianoce! :)

Kód: Vybrať všetko

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.Text;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            byte[] bytes2 = new byte[1024];
            Socket dostavac = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            dostavac.Bind(new IPEndPoint(IPAddress.Any, 2000));

            dostavac.Listen(1);
            Socket client;

            while(true) {
                client = dostavac.Accept();
                bytes2 = new byte[1024];
                int prijate = client.Receive(bytes2);

                string prijate = Encoding.ASCII.GetString(bytes2, 0, prijate); //chyba
                richTextBox1.AppendText(prijate); //chyba

                System.Threading.Thread.Sleep(500);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] bytes = new byte[1024];
            Socket posielac = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            posielac.Connect("192.168.1.20:2000"); //chyba neviem preco

            byte[] msg = Encoding.ASCII.GetBytes(textBox1.Text);

            int poslane = posielac.Send(msg);
            int dostane = posielac.Receive(bytes);

            if (poslane != dostane) {
                richTextBox1.AppendText("Spravu sa nepodarilo odoslat");
            } else {
                richTextBox1.AppendText(textBox1.Text);
            }

            posielac.Shutdown(SocketShutdown.Both);
            posielac.Close();
        }

    }
}
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# listening

Príspevok od používateľa pcsiete »

int prijate = client.Receive(bytes2);
string prijate = Encoding.ASCII.GetString(bytes2, 0, prijate); //chyba
richTextBox1.AppendText(prijate); //chyba
Dvakrát používaš meno tej istej premennej v rovnakom kontexte. Stačí premenovať jednu z nich.

Kód: Vybrať všetko

posielac.Connect("192.168.1.20:2000"); //chyba neviem preco
Dokumentácia

Kód: Vybrať všetko

posielac.Connect(IPAddress.Parse("192.168.1.20"), 2000);
Napísať odpoveď