Przesyłanie struktur przez socket

0

W C++ bardzo łatwo można to zrobić. Ale jak to uczynić w C#?
Piszę komunikator, serwer w C++ mam już prawie cały skończony i zacząłem robić okienkowego klienta w C# i dopiero teraz pojąłem, że mam problem :-O

0

Cześć

Po pierwsze nie rozumiem czemu chcesz wysyłać te struktury w C#. Przecież sam napisałeś, że w C# robisz GUI, a logika aplikacji jest napisana w C++. Jeśli jest tak jak myślę to Twój kod napisany w C++ powinien zajmować się komunikacją sieciową!

Jeśli jednak bardzo chcesz robić to w C# to sprawa jest prosta. Przykład komunikacji po TCP w C# znajdziesz tutaj:

http://msdn.microsoft.com/en-us/library/k8azesy5(VS.71).aspx

Aby wysłać strukturę przez sieć przy pomocy portów musisz zamienić ją na strumień bajtów czyli wykonać serializację. Operacja odwrotna czyli zamiana strumienia bajtów na strukturę to deserializacja. Użyj do tego klasy BinaryFormatter.

0

W C# robię klienta GUI.
A w C++ zrobiłem serwer.

0

w C# dysponujesz gotowym opakowaniem na sockets: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(VS.80).aspx
mozesz przy jej pomocy wysylac/odbierac dane we wzglednie typowy, strumieniowy sposob. mozesz np. wyslac najnormalniejsza w swiecie tablice bajtow, i dokladnie taka tablica bajtow po sockecie poleci. troche gorzej jesli nie chce Ci sie recznie sklejac takiego 'pakietu' i marzy Ci sie dobra obsluga wszystkich typow serializowalnych..

jesli Twoj serwer jest w C++ ale z C++/CLI, to jestes w domu, gdyz masz tam rowniez dostepny tcpclient/server ktory za Ciebie wszystko odwali

jesli zas jest on w czystym C++ -- musisz zadbac, aby to co klient wysyla bylo binarnie kompatybilne z tym, co C++ moze sensownie odczytac. liczby stalo- i zmienno- przecinkowe sa (uwaga na endianess!), tablice bajtow rowniez, struktury - nie, klasy - nie.

szczesliwie, jest mozliwosc takiego przygotowania klasy/struktury aby jednak byla zgodna np. nadanie atrybutu "[Serializable, StructLayout(LayoutKind.Sequential)]" patrz http://www.pinvoke.net/default.aspx/Structures/RECT.html nakazuje .net'owi utworzenie struktury ktora jest zgodna z c++'owym CRect/RECT/tagRect -- w sensie, binarnie zgodna, .net bedzie ja trzymal w dokladnie taki sam sposob.
niestety problem nie jest taki prosty -- kazdy typ danych ktory ma sie dac żywcem odzwierciedlać/przysłac, musisz dokladnie rozwazyc i sprawdzic. zwlaszcza sprawdzic ustawienia kompilatora C++ oraz atrybuty nadane typom po stronie C# -- wszelakie upakowania/aligny zwlaszcza niejawne moga Ci szybko 'nakopac' jesli nie beda zgodne po obu stronach

jesli natomiast jednak bedziesz w humorze sklejac tablice bajtow -- po porstu po jednej stornie ja jakos sklej i wyslij, po drugiej stronie odbierz do bufora char/byte i tyle filozofii. jak robisz wszystko recznie, to sam sobie zagwarantujesz ze wlasciwe pole/costam bedzie na wlasciwym offsecie

1 użytkowników online, w tym zalogowanych: 0, gości: 1