BNetEx

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu Seite Zurück  1, 2, 3 ... 11, 12, 13

Neue Antwort erstellen

Tankbuster

BeitragDo, Jan 26, 2012 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst doch auch alle der 30 Pakete mit einem Anfangsbye versehen, dass dann beim Client wiederrum ausgewertet wird, und dafür sorgt, dass die Nachrichten Ordnungsgemäß bearbeitet wird.

Ansonsten muss der Client nach verschicken von Byte=4 ja eine Sendepause einlegen (bzw Empfangspause), bis er die Daten vom Server bekommt.... Ansonsten kann er beide Sachen bearbeiten (Datei und normale Kommunikation mit dem Server)
Twitter
Download Jewel Snake!
Windows|Android

juse4pro

BeitragFr, Jan 27, 2012 1:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ganze ist (zum Glück) so konzipiert, dass kein weiterer Verkehr mit dem Server nötig ist, außer die rohen Datenmengen.
Ich werd' mir einfach ausrechnen müssen, wie viele Bytes im Stream hängen, wie viele ich schon in die Datei geschrieben habe und wie viel es dementsprechend noch sind.
Danke trotzdem.. Wink
 

Lion

BeitragSo, Feb 05, 2012 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe nun auch noch mal ein Problem...
Folgende Situation:
Ein Server mit geöffneten Ports ist an (Ports sind geforwarded, ja.). Sowohl TCP als auch UDP Streams existieren.
Client A stammt aus lokalem Netzwerk.
Client B wird über das Internet verbinden.

Beide verbinden, alles läuft reibungslos. Nun schließt Client A das Programm und öffnet es erneut: Alles in Ordnung, sowohl TCP als auch UDP Stream sind wieder ohne Probleme am laufen.
Jetzt probiert Client B das gleiche... TCP läuft, aber über die UDP verbindung kommt einfach nichts mehr beim Server an. Gar nichts. Ports sind ja offen und bei dem ersten mal hat es ja auch geklappt, aber um die UDP verbindung wieder herzustellen muss der Client anscheinend immer einige Minuten warten, bis es wieder klappt und ich sehe keinen ersichtlichen Grund. Beim Server habe ich sämtliche Abfragen für den UDPstream eingebaut, nicht einmal .RecvAvail() gibt irgendwas wieder.
Aus dem lokalen Netzwerk geht es ja auch.
Daher habe ich die Vermutung, dass es irgendwas mit den Ports sein muss. Der richtige Empfangsport ist gesetzt (es gibt keine verschiedenen Stellen, an denen die UDP-Verbindung aufgebaut werden würde, d.h. da es ja beim ersten mal geht, warum nicht auch beim zweiten und Xten mal?) und auch auf Clientseite wird bei Verbindungsabbruch der udpstream mit .Close() geschlossen und anschließend = Null gesetzt.

Ich versteh einfach nicht, wo das Problem liegt. Da es bei lokalem Netzwerk ja sowieso geht, die TCP Verbindung auch keine Mucken macht und es bei dem ersten Verbindungsversuch ja alles glatt läuft, nur danach ist es seltsamerweise verbuggt... Und die Ports freigeben sollte er ja tun, durch das .Close(), und selbst wenn nicht, der Lokale Port des Clients wird über SetLocalPort(0) gesetzt, d.h. er sollte sich ja sowieso einen freien aussuchen...

Hat jemand Ideen? Vorschläge? Irgendetwas... Dieser Fehler ist einfach nur seltsam...

Hier noch ein paar Codeschnipsel, falls gebraucht...
BlitzMax: [AUSKLAPPEN]
UDPstream = New TUDPStream
If Not UDPstream.Init() Then ErrorLog("UDPstream could not be initiated")
UDPstream.SetLocalPort()
If UDPstream.GetLocalPort() = 0 Then ErrorLog("Could not set udpport")
UDPstream.SetRemoteIP(HOST)
UDPstream.SetRemotePort(PORT)

UDPstream.WriteInt(sid)
While UDPstream.SendMsg() ;Wend

Dazu sei gesagt, dass von den ErrorLogs nichts anschlägt.

Dankeschön.


edit: lag wohl am router... Zwar hat dieser nichts im Log diesbezüglich geschrieben und auch in den firewall einstellung von jenem habe ich nichts gefunden, was explizit zugreifen würde, aber wenn ich über hamachi ne verbindung erstelle gehts wohl.. Komisches teil. danke trotzdem.
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Vertex

BeitragDi, Feb 07, 2012 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Grüße,

ich vermute, dass der Socket noch eine Weile offen gehalten wird. Sonst bekommst Du Pakete der Gegenseite an den neuen Socket übermittelt. Abhilfe sollte Socket-Option SO_REUSEADDR schaffen: http://msdn.microsoft.com/en-u...85%29.aspx
Schau mal in die Init-Methode von TTCPStream. Da werden bereits zwei Aufrufe von setsockopt_ durchgeführt. einfach noch
BlitzMax: [AUSKLAPPEN]
Local reuseAddr : Int = True
setsockopt_(socket, SOL_SOCKET_, SO_REUSEADDR_, Varptr(reuseAddr), 4)

hinzufügen (natürlich noch gegen SOCKET_ERROR_ prüfen).

Ciao Olli
vertex.dreamfall.at | GitHub
 

Lion

BeitragDi, Feb 07, 2012 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, du redest zwar ausschließlich von TCP (?) und bei mir war das Problem lediglich bei UDP, aber da die beiden Init Funktionen dieselben Optionen haben, denke ich mal, dass es einen Versuch wert ist und keinen Unterschied macht. Jedoch weiß ich nicht, wo ich den Wert für SO_REUSEADDR herbekommen soll, bei Google und über MSDN habe ich nichts gefunden, zumal es ja für Linux dann was anderes wäre.
Wo hast du denn die anderen Werte für die SO_-Optionen hergenommen?

Danke schonmal Smile Vllt lags ja doch nicht bloß am Router...

€: ah, habs doch noch gefunden... http://www.e-s-r.net/en/javado..._REUSEADDR die Werte scheinen ja sonst bei Mac und Win dieselben zu sein, hast du irgendeine Seite, wo das explizit für Linux steht?
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Vertex

BeitragDi, Feb 07, 2012 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, stimmt, UDP Smile

Code: [AUSKLAPPEN]
#define   SO_REUSEADDR   0x0004


habe ich bei http://unix.superglobalmegacor...ket.h.html gefunden. Die URL lässt vermuten, dass es sich um eine Header-Datei von Linux handelt. Das ist doch toll bei Java, da gibt Enum und EnumSet und alles wird zur Kompilierzeit geprüft Smile
vertex.dreamfall.at | GitHub

klin

BeitragSo, März 11, 2012 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

hat jemand eventuell eine Idee, wie ich das Modul mit den Events verbinden kann? Sobald ich eine Nachricht empfange, dass ein Event aufgerufen wird.

Das wäre echt klasse Wink

Klin

BtbN

BeitragSo, März 11, 2012 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Schreib dir halt selber was, prüf ob was da ist, fals ja, feuer nen event.

Mathias-Kwiatkowski

BeitragDi, Feb 11, 2014 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hoffe das ich meine frage nun hier richtig poste,?
wie ich mich richtig ausdrücken soll weiss ich grad auch nicht... ich hoffe es gelingt mir.

So wird eine nachricht üblicherweise gesendet.

Code: [AUSKLAPPEN]
'Block1
Stream.writeint 1
Stream.writeline Name
Stream.SendMsg()


was ist wenn ich aber nicht sofort senden möchte sondern dieses in einem sende verlauf packen möchte?

ich habe mir da sowas in der art gedacht
Code: [AUSKLAPPEN]
global SendeList:Tlist=new tlist
Type TSende


und an stelle von Stream.sendmsg() dieser Block1 im TSende in der liste zu "Speichern / Ablegen"
würde soetwas gehen? wenn ja wie?

wie muss mein Type TSende aussehen? ich meine natürlich das Field wie muss es ausehen?
und wie würde später das senden aussehen?
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017
 

PhillipK

BeitragDo, Feb 13, 2014 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Generell halte ich von sowas immer eher abstand.
Nein spass, ich meinte es anders:

Die daten, die du schicken möchstest, kommen nie direkt in den stream. Schreibe lieber ein Type, welches die daten in einer bank oder ähnlichem puffert.
Soweit ich weiß, sollte man bei Netzwerkpaketen immer eine gleiche größe verwenden, da sonst (wo auch immer) drosselungen stattfinden können - wenn du mehrere "kleinere" pakete schickst und dann was größeres schicken musst, soll angeblich das größere paket länger brauchen, weil die netzwerkkarte darauf nicht klarkommt.
Aber wie immer: VORSICHT gefährliches halbwissen!

Um auf deine Frage zurück zu kommen:
Speicherst du deine Daten in Types, welche sind später erst beim senden in den Stream geschrieben werden können. Diese kannst du in der zwischenzeit speichern, wie du willst.

Sende verlauf interpretiere ich so, das du eine auflistung möchtest, was in welcher reihenfolge abgeschickt wurde, um es hinterher zu verarbeiten oder zu debuggen. Eventuell ist es auch ein ansatz, um die daten in regelmäßigen abständen zu schicken (zb alle 100ms für wichtiges, alle 250ms für unwichtiges.)
Bei beidem hilft dir ein puffer-type, welches deine daten hält Smile

Ideen zum aufbau:
- Nur ein Byte Ptr // eine bank

- Wenn daten bekannt, fixe felder für integer, bytes, strings etc anlegen.

- Ein type auf rekonstruktionsbasis: Jedes type ist auf server und clientseite bekannt und hat einen fixen aufbau. Jede abstraktion des dingens kriegt eine eigene nummer, die an erste stelle in den stream geschrieben wird. Die auslese stelle erstellt einen type aus den gelesenen daten und weiß, welche abstraktion daraus wird (-> Der besagte byte)

Alternativ erkläre genauer deinen zweck des verlaufs Smile

DAK

BeitragDo, Feb 13, 2014 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@Variable Paketgröße: Mir ist da nichts bekannt, was das verursachen könnte, außer BNetEx macht das. Was aber wohl verlangsamt sind viele kleine Pakete statt einem Großen. Jede Schicht im OSI-Modell fügt eine neue runde Overhead zu den Paketen hinzu, man könnte sagen, in jeder Schicht wird das Paket neu verpackt. Dabei kommt es (bis zur maximalen Paketgröße, wo das Paket dann automatisch auf mehrere aufgeteilt wird) nicht darauf an, wie groß die Pakete sind. Ein Paket mit 5 Bit hat genauso viel Overhead wie eines mit 1000 Bit. Nur wenn man 200 5-Bit-Pakete einzeln sendet hat man 200 mal so viel Overhead wie wenn man ein 1000-Bit-Paket sendet.
Gewinner der 6. und der 68. BlitzCodeCompo

Mathias-Kwiatkowski

BeitragSo, Dez 07, 2014 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
hi habe ein fehler und weis nicht genau wodurch er ausgelöst wird.

also ich starte mein server prog und danach mein client. es wird sowohl udp als auch tcp benutzt
manchmal (fazit nicht immer) stürtzt der server ab, mit den worten : exception access violation

der fehler wird angezeigt in: bnetex.bmx Line 881

das ist folgende zeile:
Code: [AUSKLAPPEN]
MemCopy(Temp, Self.SendBuffer+Result, Self.SendSize-Result)


wie kann ich diesen manchmal auftauchenden fehler beheben? weil ich weiss nicht woran es liegt.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Vertex

BeitragMi, Sep 09, 2015 10:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Zuge der Umstellung meiner alten Projekte auf GitHub ist nun auch das BNetEx-Modul mit How-To und Beispielen dort zu finden. Der Link ist https://github.com/oliverskawronek/bnetex.mod.

Zum Modul gehört nun auch Utils dazu. Damit könnt ihr MD5, SHA, CRC16 etc. berechnen. Schaut einfach in den examples-Ordner.
vertex.dreamfall.at | GitHub

Garfield

Betreff: Rebuild kann Modul nicht erzeugen

BeitragSa, Aug 05, 2017 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte mal wieder was mit einem Webclient programmieren, aber ich bekomme das Modul nicht mehr zum laufen. Beim rebuild Module kommt folgende Meldung für die Datei bsc.d:

Code: [AUSKLAPPEN]

18: error: use of undeclared identifier 'SIOCGIFHWADDR'                      ioctl(Socket, SIOCGIFHWADDR, pInterface);


Weis jemand Rat?
Ist auf OSX Sierra
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra

Gehe zu Seite Zurück  1, 2, 3 ... 11, 12, 13

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group