Ik verstuur data van een VB6 programma naar een C++ programma over TCP/IP. Om data te versturen gebruik ik Winsock versie 1.1. Het data verkeer vind slechts in één richting plaats... Van VB6 (client) -> C++ (server).
Ik maak een socket, bind die aan TCP poort 30 en begin met het versturen van data. Dat werkt allemaal prima. Een enkel pakketje ziet er zo uit:
Ik verstuur de data bijvoorbeeld als volgt (dit is geen code uit het echte programma maar ter illustratie):
Het onvangen gebeurt zo (ter demonstratie, wederom):
Hoe kan het dat die corrupte optreed? de data die ik verstuur is immers maar 53 caracters lang en die char array moet (en wordt) dus na het ontvangen van een pakketje leeg gemaakt worden.... De regel die bij corruptie eruit komt is langer?
En buiten dat.. de communcatie moet eigenlijk plaatsvinden om de 50ms, iets dat momenteel zonder "pakket verlies", zoals ik het maar even zal benoemen, nog niet mogelijk is.
Nu kan ik natuurlijk na het ontvangen van een pakketje een acknowledge geven oid, maar dan heb ik 2x zoveel communicatie. En het is in de eerste plaats niet zo erg dat er af en toe een pakketje verloren gaat/verkeerd aankomt (want na het ontvangen worden ze verwerkt en controleer ik per pakket of ze ok zijn) maar ik moet wel om de +/- 70ms een waarde kunnen ophalen uit die pakketjes?
Is het communiceren via UDP beter (volgens de tutorials die ik gelezen heb kan ik beter TCP/IP gebruiken)? Of gaat er iets mis in de afhandeling van de data? Pingen geeft < 1ms.
Ik maak een socket, bind die aan TCP poort 30 en begin met het versturen van data. Dat werkt allemaal prima. Een enkel pakketje ziet er zo uit:
Nu het probleem; als ik om de 500ms iets verstuur, geen probleem, als ik om de 300ms iets verstuur geen probleem. Maar als ik onder de 300ms ga dan begint er corruptie op te treden. En dan komen de pakketjes er aan de andere kant bijvoorbeeld zo uit om de x (willekeurig volgens mij) cyclussen:[M1]|[DXY]|0.9234;[M1]|[OVA]|0.1423;[M1]|[STS]|0x0023;
Ze komen allemaal wel aan maar "verschuiven" soms tussen de character arrays (zie C++ code hieronder)?[M1]|[DXY]|0.9234;[M1]|[OVA]|0.1423;[M1]|[STS]|0x0023;[M1]╠╠:
Ik verstuur de data bijvoorbeeld als volgt (dit is geen code uit het echte programma maar ter illustratie):
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
| ' Timer om bv 300ms Private Sub tmrStream_Timer() Dim strTik As String If wsockTest.State = 7 Then wsockTest.SendData ("[M1]|[DXY]|0.1234;") wsockTest.SendData ("[M1]|[OVA]|0.1234;") wsockTest.SendData ("[M1]|[STS]|0x0001;") Else tmrStream.Enabled = False MsgBox "Er is geen verbinding!" Exit Sub End If End Sub |
Het onvangen gebeurt zo (ter demonstratie, wederom):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| char charBuffer[53]; int i = 0; for(i= 0; i < 52; i++) { charBuffer[i] = NULL; } i = 0; while (intSckStatus == SOCKET_ERROR) { intSckStatus = recv(socketData, charBuffer, 52, 0); if ((intSckStatus == 0)||(intSckStatus == WSAECONNRESET)) { cout << endl << "Client heeft connectie verbroken." << endl; break; } else { cout << charBuffer << endl; for(i= 0; i < 52; i++) { charBuffer[i] = NULL; } i = 0; intSckStatus = SOCKET_ERROR; } } |
Hoe kan het dat die corrupte optreed? de data die ik verstuur is immers maar 53 caracters lang en die char array moet (en wordt) dus na het ontvangen van een pakketje leeg gemaakt worden.... De regel die bij corruptie eruit komt is langer?
En buiten dat.. de communcatie moet eigenlijk plaatsvinden om de 50ms, iets dat momenteel zonder "pakket verlies", zoals ik het maar even zal benoemen, nog niet mogelijk is.
Nu kan ik natuurlijk na het ontvangen van een pakketje een acknowledge geven oid, maar dan heb ik 2x zoveel communicatie. En het is in de eerste plaats niet zo erg dat er af en toe een pakketje verloren gaat/verkeerd aankomt (want na het ontvangen worden ze verwerkt en controleer ik per pakket of ze ok zijn) maar ik moet wel om de +/- 70ms een waarde kunnen ophalen uit die pakketjes?
Is het communiceren via UDP beter (volgens de tutorials die ik gelezen heb kan ik beter TCP/IP gebruiken)? Of gaat er iets mis in de afhandeling van de data? Pingen geeft < 1ms.
[ Voor 7% gewijzigd door Verwijderd op 29-03-2007 13:05 ]