Kennst du http://www.cleancodedeveloper.de/? Du könntest mal den Code, den du produziert hast, daraufhin prüfen, ob er den Prinzipien entspricht, um selber eine Einschätzung zu bekommen, wie weit bzw. bereit du schon bist.
Mit manchen Prinzipien bin ich vertraut:
Don´t Repeat Yourself, Keep it simple, stupid, Composition over Inheritance, Versionskontrollsystem
Mit anderen habe ich wenig bis keine Erfahrung, da ich bisher nur allein Programmiert habe und der Umfang meiner Projekte relativ übersichtlich war.
Vorallem kann ich schwer einschätzen wie gut lesbar mein Code ist, da ich dazu bisher kein Feedback habe. Aber ich hatte bisher auch keine Motivation lesbaren Code zu schreiben da ich davon ausging dass ihn sonst niemand liest.
Wenn nicht in einem Praktikum, wo wäre denn ein guter Ort um Programmieren im Team zu lernen?
Ich habe grad mal hier ins "Projekte" Forum geschaut, aber da gibt es fast keine Gesuche nach Helfern.
Von welchen Frimen bzw. Branchen redest du denn da?
Ich hätte jetzt in erster Linie nach Software/IT-Dienstleistern gesucht, aber das hört sich an als gäbe es da auch Möglichkeiten in anderen Bereichen.
ich habe mich entschlossen mein Studienfach zu wechseln (von Maschinenbau zu CSE/CES) und habe daher jetzt nen halbes Jahr Leerlauf, bis zum nächsten Wintersemester.
Ich habe den Wunsch ein längeres Praktikum in C# Softwareentwicklung zu machen um die Zeit zu überbrücken.
Ich bin bei weitem kein ausgebildeter Programmierer, aber ich hab mir das Programmieren vor einigen Jahren (2007) selbst beigebracht und seit dem durch viele kleine Projekte Erfahrung gesammelt. Außerdem bin ich gut in mathe (ist das wichtig?).
Für wie realistisch haltet ihr es, dass ich überhaupt ein Praktikum bekommen?
Bieten Softwareunternehmen überhaupt Praktika an?
Die Alternative wäre für mich noch das 2. Semester Maschinenbau weiter zu machen.
Geld ist übrigens kein Problem, ich mach das auch für lau ;)
Es geht mir nicht um Performance, sondern um die Geschwindigkeit beim Programmieren.
Und das eigentliche Problem ist nicht der lange Arrayname (dafür gibts ja IntelliSense), sondern der Index "[x][y]".
Um den einzutippen brauch ich mindestens so lange wie für copy+paste. Gut, das ist kein tragisches Problem, man könnte damit leben :D. Aber, wenn es eleganter geht, warum nicht?
in einem Algorythmus wird ein zweidimensionales Array eines Werttyps (eine Enumeration) iteriert.
Innerhalb der doppelten Schleife müsste ich dann den Ausdruck "array[x][y]" verwenden. Da der Name etwas länger ist (eigentlich nicht "array") will ich den nicht jedes Mal neu tippen oder kopieren.
Wenn ich folgendes schreibe, wird der Wert aber kopiert.
typ kurzName = array[x][y];
Ich brauche aber eine Referenz (bzw. "Alias") darauf, damit der Wert im Array auch geändert wird.
Das ist eigentlich eine Grundlagenfrage, trotzdem habe ich auch nach einiger Sucherei nichts gefunden. "Boxing" scheint mir nicht der richtige Weg zu sein. Gibts dazu eine elegante Lösung? oder Copy+Paste?
Zum Problem an sich. Leider fehlt eine nachvollziehbare Beschreibung, welcher Code zu dem Problem führt (am besten minimal lauffähig) und wie das Problem dann reproduziert werden kann.
Der minimal-code ist angehängt.
Fehlerreproduktion:
Server starten
Client starten
(Testweise Nachrichten über die Konsolen hin und her schicken)
Eines der beiden Programme schließen (spielt keine Rolle welches)
Im verbleibenden Programm eine Nachricht schicken
-> BUMM (Screenshot von der Exception im VC# 2010 Express dabei)
Danke, aber ich denke ich kenne mich mit IP/TCP+UDP gut genug aus.
Und ich hätte auch nicht angefangen von einer Verbindung zu sprechen, wenn es nicht in der Fehlermeldung aufgetaucht wäre.
Das Problem besteht NUR wenn Client und Server auf dem gleichen Rechner laufen und über 127.0.0.1 kommunizieren.
Daher ist es naheliegend, dass betriebssystem-intern eine Kommunikation darüber statt findet, welche UDP ports "binded" sind.
Durch die Exception wird das Socket unsinnigerweise unbrauchbar (vielleicht ein "copy+paste" fehler in Windows, denn in bei TCP wäre das sinnvoll).
habe jetzt einen work-around hinbekommen
wenn ein socket "crasht" also diese fehlermeldung ausspuckt wird er beendet, und ein neuer mit gleichem port erzeugt.
aber ne lösung ist das nicht :-/
void NetworkPolling()
{
while (true)
{
EndPoint RemoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
Packet p = new Packet();
byte[] buffer = new byte[8192];
try
{
int byteCount = UdpSocket.ReceiveFrom(buffer, ref RemoteEndPoint);
byte[] buffer2 = new byte[byteCount];
for (int i = 0; i < byteCount; i++)
buffer2[i] = buffer[i];
p.decode(buffer2);
p.source = (IPEndPoint)RemoteEndPoint;
p.packetReceivedTime = DateTime.Now;
lock (packetQueue) packetQueue.Enqueue(p);
}
catch (SocketException ex)
{
lock (UdpSocket)
{
int port = ((IPEndPoint)UdpSocket.LocalEndPoint).Port;
UdpSocket.Close();
UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
UdpSocket.Bind(new IPEndPoint(IPAddress.Any, port));
}
}
}
}
Ich hab den Server auf Socket umgeschrieben wie du gesagt hast. -> kein Effekt.
Dann hab ich Server und Client beide auf die synchrone Receive() methode umgestellt (jeweils mit PollingThread) um das als Fehlerquelle auszuschließen.
Und den Client hab ich auch noch auf Socket (ohne UdpClient) umgeschrieben.
Resultat: Alles genau wie vorher.
Zitat von Siassei
Beim beenden des Servers musst du dafür sorgen, dass der Client zuvor die Verbindung zum Server beendet.
Das ist das Problem, wenn der Client sich beendet wird im Server eine "SocketException" ausgelöst.
Scheinbar schließe ich den Socket nicht richtig, aber habe alles ausprobiert (Disconnect, Close, etc...).
Zitat von Siassei
Kannst du mal den Code für die Kommunikation Server <-> Client bereitstellen.
Wie sieht dein Client aus? Rufst du die connect-Methode auf?
Wann bekommst du die Fehlermeldung? z.B. wenn der Server gestoppt wird.
Receive:
void NetworkPolling()
{
while (true)
{
EndPoint RemoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
Packet p = new Packet();
byte[] buffer = new byte[8192];
int byteCount = UdpSocket.ReceiveFrom(buffer, ref RemoteEndPoint); // HIER kommt die SocketException mit Errorcode 10054 {"Eine vorhandene Verbindung wurde vom Remotehost geschlossen"}
byte[] buffer2 = new byte[byteCount];
for (int i = 0; i < byteCount; i++)
buffer2[i] = buffer[i];
p.decode(buffer2);
p.source = (IPEndPoint)RemoteEndPoint;
lock (packetQueue)
{
packetQueue.Enqueue(p);
}
}
}
private void connect(IPEndPoint EP, string name)
{
Packet p = new Packet();
// ... fill packet
// setup local endpoint to listen for packets
UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// send first msg to server
UdpSend(p.encode(), EP);
NetworkPollingThread = new Thread(new ThreadStart(NetworkPolling));
NetworkPollingThread.Start();
}
Socket Setup (im Server):
ServerUdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
ServerUdpSocket.Bind(new IPEndPoint(IPAddress.Any, localPort));
Ich habe noch mal gründlicher gesucht und gesehen, dass ich nicht der erste mit diesem Problem bin.
In 3 anderen Foren wurde das gleiche Problem beschrieben, aber nirgends eine Lösung in sicht.
Für mich sieht das aus wie ein Bug.
Vielleicht wäre es mal an der Zeit MS direkt anzuschrieben?
const int localPort = 4823;
// ...
UDP = new UdpClient(new IPEndPoint(IPAddress.Any, localPort));
Client:
UDP = new UdpClient();
Der Server bekommt einen festen Port zugewiesen. Der Client startet den UDP Socket ohne Parameter, bekommt also vom System einen freien Port zugewiesen.. oder?
Habs auch getestet, einmal war der Client Port 53595.
Außerdem funktioniert der Datentransfer in beide Richtungen, nur das Schließen bereitet Probleme.
Die genaue Fehlermeldung der Exception (mit MSDN ergänzt):
Fehler
WSAECONNRESET
10054
Connection reset by peer.
An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.
Habs nach dem ich die Fehlermeldung so komplett gesehen habe im Client beim Schließen ein "UDP.Close();" eingefügt, aber das ändert auch nichts.
ich bin nach langer Zeit wieder hier im Forum, da ich ein Problem auch nach langem Debuggen und Suchen nicht lösen konnte.
Ich schreibe an einer Netzwerk-Anwendung mit Client-Server Struktur, und nutze dabei UDP, da Geschwindigkeit bei der Verbindung wichtiger ist als Zuverlässigkeit. (Es soll ein kleines 2D Spiel werden)
Client und Server Empfangen beide asynchron Daten (UdpClient.BeginReceive).
Das funktioniert auch wunderbar, solange Client und Server nicht auf der selben Maschine laufen. (Habs im LAN und übers Internet getestet)
Sobald die Verbindung übers Loopback (127.0.0.1) läuft gibts ein Problem:
Wenn sich einer der beiden Programme beendet lösen die Methoden UdpClient.BeginReceive und UdpClient.EndReceive im anderen Programm eine SocketException aus.
Das ist zum einen unlogisch, weil UDP ja angeblich verbindungslos ist.
Außerdem wird dadurch irgendwie das Socket zerstört, jeder weitere Aufruf von UdpClient.BeginReceive wird sofort mit einer weiteren SocketException quittiert.
Das mag man beim Client verschmerzen können, aber beim Server brechen damit die Verbindungen zu allen weiteren Clients ab.
ich hab schon des öfteren gehört das sehr viele leute eine eigene Homepage haben
und hier im forum haben ja die meißten noch viel mehr mit Computer und Internet zu tun
also habt ihr eignetlich eine eigene Homepage ??
als Toplevel-Domain oder als Subdomain ???
ich habe wie vermutlich die meißten auch eine Homepage http://janismac.de
Logitech 510 (Maus + Tastatur)
extrem gut !!!
hab es jez seit mehr als 3/4 Jahre und noch nie baterie gewechselt !!
mit multimediafunktionen für lautstärke- und musikseteuerung
außerdem lassen sich F1 bis F12 mit belibigen funktionen belegen (programmstart,tasten-kombinationen,uvm...)