Autor Beitrag
sebmichel
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 16.04.09 16:18 
Hallo Zusammen,

ich habe ein kleines Problem mit einer Netzwerk-Anwendung. Hier erst mal der Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
//Loop
            byte[] rcvBuffer = new byte[4096];
            int bytesRcvd;

            while (sock.Connected)
            {
                if ((bytesRcvd = sock.Receive(rcvBuffer, 0, rcvBuffer.Length, SocketFlags.None)) > 0)
                {
                    string sData = System.Text.Encoding.ASCII.GetString(rcvBuffer);
                    sData = System.Text.Encoding.ASCII.GetString(rcvBuffer);
                    
                    LogWrite(sData,0);
                    sData = "";
                    txtLog.Update();
                }
               
            }



In der Endlosschleife wartet der Socket auf Daten welche empfangen werden sollen, nachdem eine Verbindung hergestellt wurde. Das Funktioniert soweit auch, jedoch kann ich die Anwendung nicht mehr bedienen("Keine Rückmeldung"), da diese in der Endlosschleife hängt. hat hier jemand evtl. eine Abhilfe für mich?

Danke schon mal für eure Hilfe.


MfG

S.Michel

Moderiert von user profile iconKha: C#-Tags hinzugefügt
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 16.04.09 16:39 
Hallo,

was willst du den machen? Gibt so weit nicht wirklich einen Sinn und Ansatz zur Hilfe.

Gruß daniel
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 16.04.09 17:09 
:welcome:
user profile iconsebmichel hat folgendes geschrieben Zum zitierten Posting springen:
Das Funktioniert soweit auch, jedoch kann ich die Anwendung nicht mehr bedienen("Keine Rückmeldung"), da diese in der Endlosschleife hängt.
Dann brauchst du einen Nebenthread, entweder über Socket.BeginReceive oder über die Thread-Klasse. In einfachen Fällen könnte auch ein Timer und das Überprüfen der Available-Property genügen.

Zitat:
ausblenden C#-Quelltext
1:
2:
string sData = System.Text.Encoding.ASCII.GetString(rcvBuffer);
sData = System.Text.Encoding.ASCII.GetString(rcvBuffer);
Hm :gruebel: ?

PS: Ein TcpListener tut es nicht?

_________________
>λ=
sebmichel Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 16.04.09 18:30 
Die Anwendung soll sich mit einer Telefonanlage verbinden und dort die CTI-Daten auslesen. Das heißt, die Anwendung verbindet sich mit der Anlage, logt sich ein, und wartet dann kontinuierlich auf Daten und wertet diese aus. Ich habe das ganze jetzt mit Asynchronen Sockets versucht, basierend auf einem Source von MS. Jedoch habe ich hierbei die selben Probleme, und der Empfang funktioniert nur einmal. Danach erscheint in meinem "Log-Fenster" nichts mehr. Ich habe das ganze jetzt mal gepackt und bei Rapidshare hochgeladen. Vllt. könnt ihr ja mal drüber schauen und mir sagen wo der Fehler liegt, bzw. was man ändern muss.

Hier der Link: rapidshare.com/files...eoCTIClient.rar.html

Da die Datei nur 10x heruntergeladen werden kann und danach gelöscht wird, bitte nur dann herunterladen wenn Ihr euch auch wirklich damit beschäftigen wollt.


Danke für eure Hilfe.


MfG

S.Michel
BlueBeautySnake
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: So 19.04.09 17:33 
Hallo
Ich habe das gleiche Problem. Nur das mein Programm auf UDP Pakete von Netzwerkkomponenten warten soll. Hierbei handelt es sich um Konfigurationsdaten für eine Leitsoftware. Ich habe scon alles versucht. Sockets etc. Über die Sache mit den Nebenthread hab ich auch schon was gelesen. Problem ist immer das die Anwendung Stoppt und auf Pakete wartet und sich nicht mehr bedienen lässt. Wie kann man denn vorgehen wenn man die UDP Überwachung immer laufen lassen und die Pakete an die Anwendung weitergeben will. Und trotzdem mit der Anwendung arbeiten kann.

Hier mal ein Codeausschnitt. Ich hatte es über Ereignisse versucht. Aber immer das selbe die Anwendung bleibt in der Schleife hängen.
ausblenden volle Höhe C#-Quelltext
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:
27:
28:
29:
30:
31:
32:
33:
        public class UDPListener                          
        {
            public delegate void ÜbergabeAngenommen(string Text);
            public event ÜbergabeAngenommen OnÜbergabeAngenommen;
            public void StartListener()
            {
                string Text;
                UdpClient listener = new UdpClient(9050);
                IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 9050);
                byte[] bytes = listener.Receive(ref groupEP);
                Text = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
                if (OnÜbergabeAngenommen != null)
                {
                    OnÜbergabeAngenommen(Text);
                }

            }
        }                                                 

        public class Client
        {
            public void StartListener()
            {
                UDPListener Nachricht = new UDPListener();
                Nachricht.OnÜbergabeAngenommen += new UDPListener.ÜbergabeAngenommen(Nachricht_OnÜbergabeAngenommen);
                Nachricht.StartListener();
            }

            public void Nachricht_OnÜbergabeAngenommen(string Text)
            {

            }
        }
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 19.04.09 18:48 
user profile iconBlueBeautySnake hat folgendes geschrieben Zum zitierten Posting springen:
Über die Sache mit den Nebenthread hab ich auch schon was gelesen.
Und den wirst du auch unbedingt brauchen. Also entweder new Thread oder (etwas eleganter, da ressourcensparender) UdpClient.BeginReceive :nixweiss: .

_________________
>λ=
BlueBeautySnake
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: So 19.04.09 23:16 
Ich hab mal wieder die Suche in Richtung UdpClient.BeginReceive-Methode begonnen. Da fiel mir auf das ich das schon mal versucht hatte. Ich verwarf es weil immer der Fehler kam das eine using Namspace Directive fehlen würde. Und da half alles googlen nichts ich fand den zu integrierenden Namespace nicht. Der Fehler kam immer mit „UdpState”. Kannst du mir sagen um welchen es sich handelt? Ich denke das wäre des Rätsels Lösung.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 20.04.09 13:28 
Die Qualität der MSDN-Beispiele ist manchmal leider grauenhaft: UdpState soll eine eigene Klasse sein, die den UdpClient und IPEndPoint aufnimmt, damit im Callback darauf zugegriffen werden kann. Du kannst sie aber genauso in einem privaten Feld deiner Klasse speichern und als zweiten BeginReceive-Parameter null übergeben.

_________________
>λ=
BlueBeautySnake
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mo 20.04.09 17:06 
Ich hatte es heute morgen auch gefunden. Es ist es so wie du es beschrieben hast. Der Codeauschnitt ist in der MSDN Datenbank nicht angezeigt. Daher das Missverständnis.