none
Frage zur korrekten Socket-Programmierung mit 2 Ports RRS feed

  • Frage

  • Hallo

    Ich habe ein (Server)Programm, dass 2 IP-Ports abhören soll - und dann Daten verarbeiten. Jetzt bin ich mir nicht ganz sicher, ob hier alles korrekt abläuft wenn zum Beispiel von den Clients genau zur gleichen Zeit auf beide Ports Daten zu meinem Server geschickt werden - ich glaube hier ein Problem zu haben.

    Folgender Code wird in meinem Server-Programm angewendet:

    try
    			{
    				m_mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    				IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, servPort);
    				// auf lokale IP binden...
    				m_mainSocket.Bind(ipLocal);
    				// Abhören starten...
    				m_mainSocket.Listen(5);
    				// Für jede Client-Verbindung einen CallBack...
    				m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
    
    
                    m_mainSocket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    IPEndPoint ipLocal2 = new IPEndPoint(IPAddress.Any, servPort2);
                    // auf lokale IP binden...
                    m_mainSocket2.Bind(ipLocal2);
                    // Abhören starten...
                    m_mainSocket2.Listen(5);
                    // Für jede Client-Verbindung einen CallBack...
                    m_mainSocket2.BeginAccept(new AsyncCallback(OnClientConnect2), null);
    			}
    			catch (SocketException se)
    			{
    				MessageBox.Show(se.Message);
    			}


    hier die Callback-functions:

    // Die Callbackfunktion wird gestartet, wenn sich ein Client verbindet...
    		public void OnClientConnect(IAsyncResult asyn)
    		{
    			try
    			{
    				Socket workerSocket = m_mainSocket.EndAccept(asyn);
    				Interlocked.Increment(ref m_clientCount);
    				m_workerSocketList.Add(workerSocket);
    				WaitForData(workerSocket, m_clientCount);
    				m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
    			}
    			catch (ObjectDisposedException)
    			{
    				System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: Socket-1 has been closed\n");
    			}
    			catch (SocketException se)
    			{
    				MessageBox.Show(se.Message);
    			}
    		}
    
            public void OnClientConnect2(IAsyncResult asyn)
            {
                try
                {
                    Socket workerSocket = m_mainSocket2.EndAccept(asyn);
                    Interlocked.Increment(ref m_clientCount);
                    m_workerSocketList.Add(workerSocket);
                    WaitForData(workerSocket, m_clientCount);
                    m_mainSocket2.BeginAccept(new AsyncCallback(OnClientConnect2), null);
                }
                catch (ObjectDisposedException)
                {
                    System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection2: Socket-2 has been closed\n");
                }
                catch (SocketException se)
                {
                    MessageBox.Show(se.Message);
                }
               
            }

    und hier noch die WaitForData-Methode:

    public void WaitForData(System.Net.Sockets.Socket soc, int clientNumber)
    		{
    			try
    			{
    				if (pfnWorkerCallBack == null)
    				{
    					pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
    				}
    				SocketPacket theSocPkt = new SocketPacket(soc, clientNumber);
    
    				soc.BeginReceive(theSocPkt.dataBuffer, 0,
    								theSocPkt.dataBuffer.Length,
    								SocketFlags.None,
    								pfnWorkerCallBack,
    								theSocPkt);
    			}
    			catch (SocketException se)
    			{
    				MessageBox.Show(se.Message);
    			}
    		}

    und im OnDataReceived() wird dann der String aufgelöst - die Arbeiten für die geschickten Daten durchgeführt und eine Rückmeldung an den jeweiligen Client geschickt:

    ublic void OnDataReceived(IAsyncResult asyn) {

    ...

    .... try { int iRx = socketData.CurrentSocket.EndReceive(asyn); char[] chars = new char[iRx + 1]; int charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0);

    ...

    ... Socket workerSocket = (Socket)socketData.CurrentSocket; workerSocket.Send(byData); WaitForData(socketData.CurrentSocket, socketData.ClientNumber); } } }


    Da ich dieses Programm übernommen habe - und mit Socket-Programmierung im .NET noch nicht all zuviel gearbeitet habe, stelle ich hier meine Frage. Was mir hier gleich mal auffällt ist, dass überhaupt nicht auf "Thread"-Sicherheit geachtet wurde (denke ich).

    Und wie schaut das aus, wenn wirklich zur gleichen Zeit auf beiden Ports Daten geschickt werden - passt das dann so, wie hier in den Code-Ausschnitten dargestellt ??

    Vielleicht kann mir hier im Forum bitte jemand weiterhelfen und ein paar Ratschläge oder Tipps geben.

    Danke schon mal & schönen Gruß

    Michael


    Michael Erlinger

    Donnerstag, 2. August 2012 09:42

Alle Antworten