Avatar billede Greenland Nybegynder
07. februar 2009 - 14:05 Der er 9 kommentarer

Socket

Hej med jer,

Jeg laver et program i c# som kan lytte til tcp ip data fra en blackbox. Den kan sende data som raw, men når jeg forsøger at oprette min socket med sockettype raw, så får jeg fejl når jeg kører min listen();

Min kode ser således ud:
Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw,ProtocolType.Icmp);

mySocket.Bind(new IPEndPoint(IPAddress.Any, 8080));

            mySocket.Listen(4);
            mySocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
osv videre.

men når listen(4) bliver udført får jeg følgende fejl:
The attempted operation is not supported for the type of object referenced

Kan nogen hjælpe til med dette !

Hvis jeg kører det på denne måde:
mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
så får jeg ikke nogen fejl når listen(4); køres, men jeg skal altså køre med raw.


mvh

Greenland
Avatar billede arne_v Ekspert
07. februar 2009 - 15:11 #1
Raw IP har ikke noget connection begreb og derfor giver det ikke mening at vente på connections.

Er du helt siker på at det er raw IP og ikke et raw format sendt over TCP (eller UDP) ?
Avatar billede Greenland Nybegynder
07. februar 2009 - 17:38 #2
Hej arne_v

Det er tcp som det kører over,men inde på min blackbox kan man vælge at sende data som raw,SSL og to andre valgmuligheder. Jeg troede blot at jeg blev nødt til at oprette sockettype som raw, men det har muligvis ikke noget med det at gøre, kan jeg forstå.

Problemet er blot at mit program modtager ikke nogen data når blackboksen står til at sende som raw, men hvis jeg starter et net program programmeret i delphi så modtager det data også når det er raw der er angivet i blackboksen...
Avatar billede arne_v Ekspert
07. februar 2009 - 17:44 #3
Skal det absolut være async ?

Simpel TcpListener og AcceptTcpClient og normal Read vil måske gøre koden lidt simplere.
Avatar billede Greenland Nybegynder
07. februar 2009 - 17:56 #4
Okay, måske skulle jeg prøve det istedet for.
Hvis jeg ikke kan få det andet til at virke så er det vel en løsning.

Hvordan skal koden se ud? fx således:

static TcpListener tcp;

        private void button1_Click(object sender, EventArgs e)
        {
tcp = new TcpListener(IPAddress.Any,8080);
            tcp.Start(4);
            tcp.AcceptTcpClient();
}..

ser ud til at mit program hænger når jeg trykker på knappen...!?
Avatar billede arne_v Ekspert
07. februar 2009 - 18:09 #5
Eksempel:

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class Server
{
    public static void Main(string[] args)
    {
        TcpListener srv = new TcpListener(IPAddress.Any, 1234);
        srv.Start();
        TcpClient cli = srv.AcceptTcpClient();
        Stream nstm = cli.GetStream();
        Stream fstm = new FileStream(@"C:\z.2", FileMode.CreateNew, FileAccess.Write);
        byte[] b = new byte[10000];
        int n;
        while((n = nstm.Read(b, 0, b.Length)) > 0)
        {
            fstm.Write(b, 0, n);
        }
        nstm.Close();
        fstm.Close();
        cli.Close();
        srv.Stop();
    }
}
Avatar billede arne_v Ekspert
07. februar 2009 - 18:09 #6
Men ja - AcceptTcpClient venter indtil client connecter.
Avatar billede arne_v Ekspert
07. februar 2009 - 18:11 #7
Så hvis det er en GUI app skal det koeres i en tråd ikke i en click metode.
Avatar billede Greenland Nybegynder
07. februar 2009 - 19:48 #8
Ok tak for svar,  jeg prøver løsningen senere i aften og vender tilbage..
Avatar billede Greenland Nybegynder
24. marts 2011 - 12:45 #9
længe ventet svar:-
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester