Datenverlust bei Ethernet / Winsock
-
Hallo Zusammen!
Ich hoffe, mir kann jemand helfen, nachdem meine letzten Suchen erfloglos blieben
Es geht um Folgendes:
Ich lese in meinem Projekt die Daten eines LaserScanners über die Winsock-Funktion ein. Die Verbindung funktioniert und Teile der Daten kommen auch an. Allerdings wird nach ca 1/4 des Öffnungswinkels des Lasers kein Scanpunkt mehr in mein Array eingelesen. Mein Array ist mit 4294967295 Zeichen deutlich größer als die zu empfangene Datemenge (und wird auch zum Schluss mit Nullen gefüllt).
Es kann eigtl. kein Hardwarefehler seitens des Scanners sein, da bei der Gegenkontrolle mit dem Hersteller eigenen Tool alle Scanpunkte erfasst werden.Hat jemand hier (oder in ähnlicher Weise) shcon Erfahrungen gesammelt und kann mir meinen Fehler aufdecken? Um jede Antwort dankbar
-
UDP oder TCP?
-
4294967295
Nun, dein Datenpuffer ist 4 Gigabyte gross?
kann mir meinen Fehler aufdecken?
Wie du richtig erkannt hast, liegt es an deinem Programm. Ohne dein Programm zu sehen, kann ich den Fehler des Programms auch nicht sehen.
-
Also im Falle einer TCP-Verbindung sollten keine Daten verloren gehen, daher würde ich zunächst mal vermuten, dass du die Socketfunktionen nicht korrekt verwendet hast.
Hast du eine Schleife gebaut die solange "recv" aufruft, bis alle Daten angekommen sind, oder wie hast du das gemacht?
Es wäre hilfreich wenn du zumindest mal den Quellcode rund um den Socket hier posten würdest.
Warum ist dein Buffer 4GB groß? Hast du überhaupt soviel Arbeitsspeicher und hast du 4GB am Stück allokieren können?
Hier sind irgendwie mehrere Punkte, an denen ich so meine Zweifel habe...
-
@ Jochen: eingelesen wird via TCP
@knivil:jaaa - das hab ich dann auch gemerkt, dass der Buffer wohl etwas groß war.
Hier ist noch der entsprechende Code-Ausschnitt
und achso: schon mal vielen Dank für die schnellen Antwortenint CIbeoA2LaserScanner::IbeoA2main(void)
{
int nRes = 0;
unsigned int uIPAddress, uPort;if (!GetArguments(&uIPAddress, &uPort))
{
return 1;
}SOCKET mIbeoA2_sock = Connect (uIPAddress, uPort); //Connection
if (mIbeoA2_sock == INVALID_SOCKET)
{
nRes = WSAGetLastError();
fprintf (stderr, "Network error #%d\n", nRes);
mIbeoA2_connected = 0;
}
else
{
// message buffer
const unsigned long long uMsgMaxSize = 0x79999;
char Msg[uMsgMaxSize];// Main loop
while (!m_bRXThreadClosing)
{
// Receive data
nRes = recv (mIbeoA2_sock, Msg, uMsgMaxSize, 0);if (nRes == 0)
break; // connection has been closed
else if (nRes == SOCKET_ERROR)
{
nRes = WSAGetLastError();
fprintf (stderr, "Network error #%d\n", nRes);
break;
}
else
{
decodeMsg(Msg, nRes);
}
}
closesocket (mIbeoA2_sock);
mIbeoA2_connected = 0;
}
WSACleanup();m_bRXThreadClosing = false;
return nRes;
}
-
Ich glaube Du hast nicht verstanden wie "recv" funktioniert.... schau Dir mal einige Beispiele an... mit "recv" kommt eine beliebige Anzahl von Zeichen zurück. Manchmal auch nur eines... Du musst also irgendwie erkennen, wann Dein Paket fertig ist...
-
Hi,
dein Scanner sendet zuerst einen kleinen header, indem steht was nun kommt,
diese Sizeangabe verwendest du zum auslesen, wenn ungleich wars nicht gut.Pseudo:
recv(header..,festelänge,..)if( recv(data, header.länge,..) != header.länge )
return;Ps(ist immer so)
Grüße
Karsten