array<System::Byte> als buf char* parameter für Winsock->send() oder so ...!
-
So ich hoffe mal der Titel sagt alles haha, ich wusste nicht genau wie ich mein Problem schildern soll da ich momentan ziemlich hänge.
Ich bin natürlich auch kein C++ Crack sondern Kategorie Programmiere eher ganz andere Sachen.
So nun zu meinem Problem.
Ich muss ein Byte Array erstellen um es dann als Char an einen TCP Port zu senden, so zu mindestens die Aufgabe.
Mein Byte Array haut soweit auch hin glaub ich:
char* cmd = "stuff"; //Laenge des cmd int cmdLength = strlen(cmd); //die Laenge des byteArray für result | cmd length + 2 (CRC) int endByteLength = cmdLength + 2; //Damit BitConverter::GetBytes 2 bytes zurückgibt short sumAscii = 0; for(int i=0; i < cmdLength; ++i) sumAscii = sumAscii + (cmd[i] - 0); //erstellt aus short ein 2byte langes byteArray array<System::Byte>^byteArray = BitConverter::GetBytes( sumAscii ); array<System::Byte>^ klaArray = nullptr; // Erzeugen: klaArray = gcnew array<System::Byte>( ( endByteLength + 1 ) ); // Bearbeiten. klaArray[0] = endByteLength; //cmd char ins array einfügen for(int i=0; i < cmdLength; ++i) klaArray[i+1] = cmd[i]; //CRC einpassen sind immer 2 Bytes klaArray[endByteLength - 1] = byteArray[0]; klaArray[endByteLength] = byteArray[1];
Das Array besteht aus länge Byte Array, CMD als Byte Array, CRC (2byte little Endian).
So mein Problem ist nun das Versenden an den Port via Winsock.
int iResult; //Winosck init funzt soweit //hier muss ich irgendwie so was machen char* sendbuf = klaArray; //geht natürlich nicht iResult = send( ConnectSocket,sendbuf , strlen(sendbuf), 0 );
Dass ich ein signed Char* nicht einfach mit einem Byte Array belegen kann ist klar, ich hab auch schon einige Sachen probiert aber nicht wollte so richtig funktionieren.
Entweder ging es gar nicht oder es kam etwas raus was nicht zu dem Byte Array passt.Vieleicht mach ich auch etwas grundlegendes Falsch oder gibt es eine bessere Möglichkeit so ein Byte Arrasy an einen Port zu senden.
der Server hinter dem Port erwartet diese Byte Struktur(length|cmd|Crc) als Char, soweit ich es verstanden habe.
Ich hoffe auf ein wenig Hilfe und versuche so oft wie möglich on zu kommen falls noch etwas fehlt.
-
mmpf anscheinend hat das zusammenfassen der Informationen so lange gedauert das er mich abgemeldet hat.
Aber der Eintrag war von mir, vieleicht kann ein Admin das steuern oder so lassen.
-
Nur das ich das richtig verstehe: Du willst char* nach arraySystem::Byte umwandeln, um was anzuhaengen und dann wieder zurueck nach char* ums mit WinSock zu versenden?
Mein Vorschlag waere: Du kopierst deinen String in einen std::vector<char>, haengst deine restlichen Bytes an und versendest ihn dann. Um einen Pointer auf den Inhalt des vectors zu kriegen, benutze die Funktion vector.data();, fuer die Groesse vector.size();.
Ach ja, vector.data gibts erst bei C++11, musst mal schauen inwiefern dein Compiler das unterstuezt.
-
Typisches Gemisch aus C++ bzw. C und C++/CLI von einem der nicht weiss was zu welcher Welt (native / managed) gehört. Es führt zu Problemen. Einerseits beim Kompilieren, andererseits auch zur Laufzeit, wenn man nicht ganz genau weiss was man tut (was hier offensichtlich der Fall ist).
Entweder native C++ oder C#, nicht C++/CLI. Wenns denn unbedingt C++/CLI sein muss, bitte NUR C++/CLI!
Hier noch was lesenswertes, besonders die letzen Posts:
http://www.c-plusplus.net/forum/263084Edit
Bevor es std::vector<T>::data() gab, hat man einfach die Adresse vom 1. Element genommen (&v[0], wobei v ein Objekt vom Typ std::vector<T> ist).
-
Jonas OSDever schrieb:
Nur das ich das richtig verstehe: Du willst char* nach arraySystem::Byte umwandeln, um was anzuhaengen und dann wieder zurueck nach char* ums mit WinSock zu versenden?
Irgendwie hast du Recht, gestern sah es für mich auch besser aus, aber wenn ich heute rauf schaue Char -> Byte -> Char sollte ich vieleicht mal überdenken.
Jonas OSDever schrieb:
Mein Vorschlag waere: Du kopierst deinen String in einen std::vector<char>, haengst deine restlichen Bytes an und versendest ihn dann. Um einen Pointer auf den Inhalt des vectors zu kriegen, benutze die Funktion vector.data();, fuer die Groesse vector.size();.
Ach ja, vector.data gibts erst bei C++11, musst mal schauen inwiefern dein Compiler das unterstuezt.
Werde mir Vector mal anschauen, hab ich bisher noch nicht wirklich gesehen.
Arbeite mit VS 2012 / Win7 also sollte das wohl passen.
theta schrieb:
Typisches Gemisch aus C++ bzw. C und C++/CLI von einem der nicht weiss was zu welcher Welt (native / managed) gehört. Es führt zu Problemen. Einerseits beim Kompilieren, andererseits auch zur Laufzeit, wenn man nicht ganz genau weiss was man tut (was hier offensichtlich der Fall ist).
Entweder native C++ oder C#, nicht C++/CLI. Wenns denn unbedingt C++/CLI sein muss, bitte NUR C++/CLI!
Hier noch was lesenswertes, besonders die letzen Posts:
http://www.c-plusplus.net/forum/263084Edit
Bevor es std::vector<T>::data() gab, hat man einfach die Adresse vom 1. Element genommen (&v[0], wobei v ein Objekt vom Typ std::vector<T> ist).Aha, ich hab immer gedacht C++/Clr ist C++ wobei man eben auch die Windows Bibliotheken nutzen kann.
Mach C++ erst seit ein paar (Anfang der Woche damit angefangen) Tagen und bei OReily ist schon ein bisschen was dazu bestellt. Akteull ist C++ ja eher ein Hoby.
Der Link ist lustig hehe, aber haut bist auf das C++ - C++/Cli Gemische nicht für mich hin. Ps. bin nicht im ersten Semester, das ist schon Jahre her.
C# stimmt schon, hab ich mir vor 2 Jahren auch schon mal angeschaut aber nur kurz für die Win Forms und den Sharepoint da gibt es auf jeden Fall mehr Hilfe.Hab in letzter Zeit viel in Industrie Betrieben zu tun und wollte mir deswegen mal C++ anschauen da dort nichts anderes geht aufgrund der gewachsenen librarys. Und sich hin und wieder mal weiterzubilden kann ja nicht schaden. Also stellt mir nen Kumpel aufgaben und ich schau wie ich die Löse.
So und darauf geachtet das ich mich wieder einlogge ...
-
Wenn du erst seit Anfang der Woche C++ machst wuerde ich dir empfehlen erstmal klein anzufangen.
Aha, ich hab immer gedacht C++/Clr ist C++ wobei man eben auch die Windows Bibliotheken nutzen kann.
Spricht auf jeden Fall dafuer.
Zur kurzen Erklaerung: C++/CL***I*** (:p) hat mit C++ nicht viel gemein. Es ist als Interop gedacht, sollte man wirklich mal managed und unmanaged Code mischen muessen (glaub mir das kommt so selten vor, dass dich das jetzt noch gar nicht interessieren muss). Fuer die alltaegliche Programmierung ist es ungeeignet (siehe Thetas link).
Und nein, du brauchst es nicht um die Windows-Bibliotheken verwenden zu koennen. Nur, falls du unter "Windows-Bibliotheken" alleine das .NET-Framework verstehst, wuerde diese Aussage stimmen. Das WinAPI oder auch die MFC brauchen kein C++/CLI, die sind normale C (WinAPI) und C++ (MFC) Bibliotheken (der Vollstaendigkeit halber sei erwaehnt, dass auch die nicht in reinem Standard-C(++) geschrieben sind, allerdings sind diese MS-Spezifischen Spracherweiterungen per Default eingeschaltet).
C++/CLI dagegen ist eine neue Sprache und hat mit Standard-C++ nicht mehr viel gemein. Vieles aehnelt sich, keine Frage, aber versuch mal .NET-Objekte in einen std::vector zu stecken. Das geht nicht, und selbst wenn, kannst du davon ausgehen, dass das Programm frueher oder spaeter crahst.Aber wie gesagt: Ich empfehle dir erstmal richtiges Standard-C++ zu lernen, bevor du dich mit Netzwerkprogrammierung usw. rumschlaegst.
-
Danke dir,
so ähnlich dachte ich mir das schon.
Aktuell versuch ich zu verstehen was denn nun C++, C++/CLI, C++/Clr ist und welche DatenTypen welche Version nutz/unterstützt haha.
Hab mir bei Oreily "C++ In a Nutshell" besorgt was auch hilft, teilweise.Vieleicht sollte ich mal sagen wozu ich das überhaupt mache. Mir geht es nicht darum GUI Apps zu bauen oder die Microsoft Progs (Excel, Word) anzupassen. Dafür gibt es bessere Sprachen, find ich.
Sinn dahinter ist eigentlich das ich mir schon ne weile diese ganze Schnittstellen Sachen (Relaiskarten, Kameras) zu Steuern, nicht aus Notwendigkeit sondern weil es geht. Die Bibliotheken dafür sind meist nur für C/C++ und auch schon 6-10 Jahre alt. Auf C hab ich eigentlich keine Lust gehabt.
Bsp. hab ich über einen bekannten eine bessere Webcam mit C++ Bibliotheken hier und dachte das ist mal ein guter Grund damit anzufangen, da die auch unter Win 7 laufen, was bei den Relaiskarten ja meist nicht der Fall ist. Matlab oder Profilab wollte ich eigentlich nicht nutzen obwohl es wohl einfacher wäre. Visual Studio nutze ich weil ich es relativ einfach bekomme auch die Pro Version, nicht Express, Ultimate ist mir ein bisschen zu teuer.
Clr hab ich in VS eigentlich nur aktiviert weil es wohl einige Bibliotheken/Klassen automatisch hinzufügt, z.B. bei arraysystem::byte^.
Zum Thema klein anfangen, ich bin mittlerweile schon etwas älter als 30 und baue schon was länger Anwendungen. Bisher fand ich eigentlich, dass man bei komplexen Aufgaben am meisten lernt.
Natürlich geht das dann nicht schnell oder ist einfach. Aber mal ehrlich eine Sprache versteht man wenn überhaupt, erst nach ein paar Jahren intensiver Nutzung und selbst dann lernt man immer noch dazu.Was mir hier ein bisschen fehlt ist eine gute Docu, so was wie Java Doc. Die Microsoft Doku find ich nicht so Doll und auch nicht wirklich übersichtlich. Irgendwie find ich zu C++/Cli auch relativ wenig Literatur die sich nicht ausgiebig mit Forms und der Steuerung von Visual Studio beschäftigt.
Eine Übersicht der Datentypen und Manipulations Möglichkeiten würd auch helfen, aber ich schau ja erst ein paar Tage und die Sprache ist ja nicht wirklich neu. Kurios find ich z.B. das man zu Winsock nen Haufen Hilfe findet aber rein zu den Datentypen kaum was, aber vielleicht such ich auch falsch haha.Edit: mmpf kaum sag ich ich find keine richtige Doc, stoss ich darauf haha http://www.cplusplus.com/reference/stl/vector/
-
Nochmal zum mitschreiben: C++/CLI ist eine Sprache, die in der CLR (zumindest die managed Teile) ausgefuehrt wird. C++/Clr gibt es nicht.
Kubain schrieb:
Sinn dahinter ist eigentlich das ich mir schon ne weile diese ganze Schnittstellen Sachen (Relaiskarten, Kameras) zu Steuern, nicht aus Notwendigkeit sondern weil es geht. Die Bibliotheken dafür sind meist nur für C/C++ und auch schon 6-10 Jahre alt. Auf C hab ich eigentlich keine Lust gehabt.
Gerade bei solchen Sachen hat C++ eben immernoch einen hohen Stellenwert weils nativ laeuft. Vieles koennte man in C#/VB sicher auch machen - allerdings meist mit mehr aufwand.
Zum Thema "auf C hab ich keine Lust mehr": Viele solche Schnittstellen (und auch das WinAPI) sind eben nur ein C-Interface. D.h. an der Schnittstelle hast du oft C-Stil, darfst also keine Klassen usw. erwarten. Was du dann drum rum baust kann natuerlich C++ sein.Kubain schrieb:
Bsp. hab ich über einen bekannten eine bessere Webcam mit C++ Bibliotheken hier und dachte das ist mal ein guter Grund damit anzufangen, da die auch unter Win 7 laufen, was bei den Relaiskarten ja meist nicht der Fall ist. Matlab oder Profilab wollte ich eigentlich nicht nutzen obwohl es wohl einfacher wäre. Visual Studio nutze ich weil ich es relativ einfach bekomme auch die Pro Version, nicht Express, Ultimate ist mir ein bisschen zu teuer.
Das Relaiskarten nicht unter Win7 funktionieren waere mir neu (die meisten gehen ja sogar noch ueber die RS232), nur kann es halt sein, dass fuer die alten keine Win7-Treiber mehr existieren.
Bezueglich der WebCam: Ob es jetzt Sinn macht die als Grund zu sehen C++ zu lernen wage ich mal zu bezweifeln. Zumindest darfst du nicht erwarten, dass du gleich nach 2 Wochen C++ die Webcam programmieren kannst. Wie gesagt, du solltest, auch wenn das vielleicht etwas bloed klingt, erstmal bei Standard-C++ ohne 3rd-Party-Bibliotheken lernen.Kubain schrieb:
Clr hab ich in VS eigentlich nur aktiviert weil es wohl einige Bibliotheken/Klassen automatisch hinzufügt, z.B. bei arraysystem::byte^.
Und genau das ist eine falsche Schlussfolgerung: C++/CLI fuegt eben nciht nur "einige Klassen hinzu" sondern ist eine eigene Sprache mit einer eigenstaendigen Klassenbibliothek, dem .NET-Framework. Du versuchst hier C++ und C++/CLI zu mischen, aber das geht schlicht und einfach nicht gut.
Kubain schrieb:
Zum Thema klein anfangen, ich bin mittlerweile schon etwas älter als 30 und baue schon was länger Anwendungen. Bisher fand ich eigentlich, dass man bei komplexen Aufgaben am meisten lernt.
Natürlich geht das dann nicht schnell oder ist einfach. Aber mal ehrlich eine Sprache versteht man wenn überhaupt, erst nach ein paar Jahren intensiver Nutzung und selbst dann lernt man immer noch dazu.Es stimmt, das man bei komplexen Aufgaben viel lernt. Allerdings ist ein Grundverstaendnis der Sprache noetig. Aus "[ich] baue schon etwas laenger Anwendungen" schliesse ich mal, dass du schon eine andere Programmiersprache (Java?) kannst. Das ist dir beim lernen von C++ sicher eine Hilfe, da vieles aehnelt, aber letzendlich musst du doch etwas kleiner anfangen. Klar versteht man eine Sprache erst vollstaendig nach jahrelanger Nutzung, aber sich gleich in Grossprojekte reinzustuerzen ist auch nicht der richtige Weg.
Dabei behaupte ich ja nicht, dass du jetzt Jahrelang nur Standard-C++ machen sollst. Aber zumindest die Grundlagen solltest du lernen, bevor du dich ins kalte Wasser stuerzt.Kubain schrieb:
Edit: mmpf kaum sag ich ich find keine richtige Doc, stoss ich darauf haha http://www.cplusplus.com/reference/stl/vector/
Diese Website ist immer eine sehr gute Anlaufstelle was Standard-C++ betrifft.
Wenn du dich mit WinAPI, WinSock und co. rumkloppen willst, waere die MSDN immer eine gute Anlaufstelle.
-
Kubain schrieb:
Die Microsoft Doku find ich nicht so Doll und auch nicht wirklich übersichtlich. Irgendwie find ich zu C++/Cli auch relativ wenig Literatur die sich nicht ausgiebig mit Forms und der Steuerung von Visual Studio beschäftigt.
1. Die Klassen, die in C++/CLI genutzt werden können stammen aus dem .NET Framework und sind somit sehr gut dokumentiert. Ev. verwirrt es dich, dass meistens C# oder VB.NET auf den MSDN Dokuseiten als erstes erscheint, man kann es aber umstellen. Aus der Sicht, welche Klassen aus dem .NET Framework und wie ich sie benutzen kann, unterscheidet sich C#, VB.NET, C++/CLI, F#, etc. nicht (wenn, dann nur marginal).
2. Das die Doku nicht auf C++/CLI und WIndows Forms ausgerichtet ist, hat damit zu tun, dass (nun endlich) Microsoft der Meinung ist, dass C++/CLI nicht geeignet ist um Applikationen, geschweige denn GUIs, zu erstellen, sondern eben nur für Interop gedacht ist.
-
Soweit alles richtig haha. Relaiskarten unter Win7, hab ich noch nichts mit gemacht. Aber ein Freund hat relativ viel damit zu tun und meckert immer das es eben meist nur unter WinXp läuft weil die Dlls nicht mehr hinhauen. Aber das nur nebenbei.
ja java, nen bisschen Objective-C, auch mal kleinkram in C# und so Script sachen wie Php, JS.
Zu dem lernen und klein anfangen.
Mal abgesehen von dem Winsock Gedöns was ja soweit funzt besteht mein Testprojekt aus einer cpp Datei in der eigentlich nur das drin ist was in meinem ersten Beitrag steht. Und ich meine Viel einfacher als mach was mit verschiedenen Datentypen, schaue dir Adressen und Zeiger an, ist ja dann nur Hello World hehe.Ich mein Datentypen wie int, bool, string oder Schleifen for, while, do brauch ich wohl nicht neu lernen.
Das mit dem Byte Array kam eigentlich nur daher das ich aus einer Zahl ein byte Array mit 2 Elementen als CRC bilden Wollte und ich dachte byte Array = arraysystem::byte. Darauf bin ich eigentlich auch nur gestossen weil ich ne funktion gesucht hab die eben das macht, aus nem int in demfall short int nen byte Array.
Clr/Cli unmanaged - managed Code hab ich grad ein bsichen was dazu gelesen und das Clr mal wieder entfernt haha. Kommt man ja nicht drauf das aus einer Runtime Unterstützung gleich ne neue Sprache wird.
Ach so die Kamera war nur ein Beispiel und die Steuert man nur über die Bibliothek, was soweit auch funzt. ist im Endeffekt ja auchnciht mehr als die Klasse aufrufen und parameter übergeben.
Edit: Back to the roots Int in byte kann man natürlich auch selber errechen, müde Programmieren kann echt lästig sein haha.
Bin euch für die Tips sehr dankbar besonders was C++ und C++/Cli betrift.
Alles in allem so siehts nun aus und es kommt auch genau das an was ankommen soll.
//Laenge des cmd int cmdLength = strlen(cmd); // 4 //das eigentlich array vector<char> klaArray; klaArray.push_back(cmdLength + 2); short sumAscii = 0; for(int i=0; i < cmdLength; ++i) { sumAscii = sumAscii + (cmd[i] - 0); klaArray.push_back(cmd[i]); } klaArray.push_back((byte)(sumAscii & 255)); klaArray.push_back((byte)(sumAscii >> 8));