Toon posts:

[C#]Asynchrone sockets en streams

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben vrij nieuw met .NET en C#.

Ik ben een applicatie aan het maken met een klein communicatie protocol.

Er is een server gedeelt en een client gedeelte. Het is mogelijk dat meerdere clients tegelijk de server benaderen. Vandaar dat ik gebruik wil maken van een asynchrone verbinding.

Op het moment kan ik met de volgende code 1 verbinding afhandelen. Op het moment dat er tegelijkertijd nog een verbding word gemaakt word deze wel geaccepteerd, alleen worden de commando's niet afgehandeld.

Dit is mijn code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void Listen()
        {
            IPEndPoint lep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), sPort);
            sListener = new TcpListener(lep);

            sListener.Start();
            sListenSocket = sListener.AcceptSocket();
            while (true)
            {

                try
                {
                    if (sListenSocket.Connected)
                    {
                        HandleSocket();                 }

                }
                catch
                {
                    sListenSocket.Shutdown(SocketShutdown.Both);
                    sListenSocket = sListener.AcceptSocket();
                }


            } //while
        } //method


sListenSocket is een globale Socket variable.

Ik heb geprobeerd om de HandleSocket() methode in een eigen thread te starten. Dit werkt niet helemaal goed (krijg Memory Exceptions). Ik heb gekeken naar Socket.CallBack(), maar dit werkt ook niet helemaal hoe ik het wil (verbinding word direct vebroken na het openen van de socket).

Op welke manier kan ik zorgen dat ik meerdere verbdindingen tegelijk kan afhandelen?

mijn HandleSocket methode ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void HandleSocket()
        {
            Socket sListenSocket = (Socket)ar.AsyncState;
            NetworkStream Stream = new NetworkStream(sListenSocket);

            System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(Stream);
            System.IO.StreamReader streamReader = new System.IO.StreamReader(Stream);

            try
            {
                streamWriter.WriteLine(AddCheckSum(HandleCommand(new PMMPPacket(streamReader.ReadLine()))));
                streamWriter.Flush();
            }
            catch
            {
                        
                streamWriter.WriteLine(AddCheckSum(Communication.ControlCodes.INVALID_CMD));
                streamWriter.Flush();
            }
            //sListenSocket.Close();
            //sListenSocket.Shutdown(SocketShutdown.Both);

        }

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Je zult toch HandleSocket binnen een thread moeten draaien. Zorg dan wel dat je globale variablen goed locked en unlocked, anders gaat je applicatie op z'n bek met meerdere threads.

Verwijderd

Topicstarter
eghie schreef op vrijdag 06 januari 2006 @ 10:29:
Je zult toch HandleSocket binnen een thread moeten draaien. Zorg dan wel dat je globale variablen goed locked en unlocked, anders gaat je applicatie op z'n bek met meerdere threads.
Inderdaad. Maar moet ik dit doen door 'handmatig' een thread te starten, of iets met die Socket.CallBack() methode?

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void Listen()
        {
            IPEndPoint lep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), sPort);
            sListener = new TcpListener(lep);

            sListener.Start();
            sListenSocket = sListener.AcceptSocket();
            while (true)
            {

                try
                {
                    if (sListenSocket.Connected)
                    {
                        HandleSocket(sListenSocket);
                    }
                }
                catch
                {
                    sListenSocket.Shutdown(SocketShutdown.Both);
                    
                }
                               sListenSocket = sListener.AcceptSocket();

            } //while
        } //method


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void HandleSocket(Socket sListenSocket)
        {
            NetworkStream Stream = new NetworkStream(sListenSocket);

            System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(Stream);
            System.IO.StreamReader streamReader = new System.IO.StreamReader(Stream);

            try
            {
                streamWriter.WriteLine(AddCheckSum(HandleCommand(new PMMPPacket(streamReader.ReadLine()))));
                streamWriter.Flush();
            }
            catch
            {
                        
                streamWriter.WriteLine(AddCheckSum(Communication.ControlCodes.INVALID_CMD));
                streamWriter.Flush();
            }
            sListenSocket.Close();
        }


dit is wat ik er atm van maak.
wil je meerdere tegelijk laten werken, dan moet je threading of asynchrone sockets gebruiken

ASSUME makes an ASS out of U and ME


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Verwijderd schreef op vrijdag 06 januari 2006 @ 10:45:
[...]


Inderdaad. Maar moet ik dit doen door 'handmatig' een thread te starten, of iets met die Socket.CallBack() methode?
Ik denk dat het makkelijks is als je handmatig die thread start. Ik ken de callback methode niet, dus kan daar eigenlijk niks over zeggen.

Verwijderd

Onderstaand artikel geeft antwoord op je vraag:
http://www.codeproject.com/csharp/socketsincs.asp
Pagina: 1