BNet - Netzwerkmodul / Kompatibel mit BlitzBasic

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen

Vertex

BeitragDo, Feb 17, 2005 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Smile

Neue Version 1.36 ist draußen mit kleiner readme zur Installation, Befehlsreferenz usw.

Bug gefunden und behoben, wo man von Klienten mit AcceptTCPStream nicht lesen konnte.

http://vertex.art-fx.org/bnet.zip

Weiter habe ich bemerkt, das folgendes Beispiel nicht geht:
Code: [AUSKLAPPEN]
www = OpenTCPStream("vertex.art-fx.org", 80)
If Not www Then
   Notify "Konnte nicht verbinden!"
   End
EndIf

WriteLine www, "GET http://vertex.art-fx.org/3D/wireframe2.png HTTP/1.0"
WriteLine www, ""

For I = 1 To 10
   Print ReadLine(www)
Next

stream = CreateFile("temp.png")
While Not Eof(www)
   WriteByte stream, ReadByte(www)
Wend

CloseFile stream
CloseTCPStream www

Graphics 323, 253, 0, 0
image = LoadImage("temp.png")
DrawImage image, 0, 0
Flip
WaitKey
End


Er hört dann auf, wenn s_FD_ISSET gleich 0 ist. Muss mal schauen wie cih das noch fixen kann.

mfg olli
vertex.dreamfall.at | GitHub

Vertex

BeitragSa, Feb 19, 2005 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fehler konnte nun eingegrenzt werden. Habe jetzt ein haufen ioctlsocket, setsockopt Zeug versucht, und es ist immer gescheitert. Dann ist mir aufgefallen, er hält ja garnicht das Read-Timeout von 10 Sekunden ein. Wenn ich nämlich bei BlitzClassic da nur 10 Millisekunden angebe, kann er die Datei auch nicht richtig auslesen. Und hier gibt es halt garkein Timeout beim lesen.

Es liegt also im Großen und Ganzen an:
Code: [AUSKLAPPEN]
         Case NETLIB_TCP_CLIENT
            If iSocket = INVALID_SOCKET Then Return 0

            s_FD_ZERO(TNetwork.tFDSRead)
            s_FD_SET(iSocket, TNetwork.tFDSRead)
           
            If s_select(0, TNetwork.tFDSRead, Null, Null, tReadTimeout) = SOCKET_ERROR Then Return 0

            iResult = s_recv(iSocket, pBuffer, iCount, 0)
            If iResult = SOCKET_ERROR Then
               Close()
               iEOF = -1
               Return 0
            ElseIf iResult = 0 Then
               Close()
               Return 0
            Else
               iEOF = 0
               Return iResult
            EndIf


mfg olli
vertex.dreamfall.at | GitHub

Vertex

BeitragSo, Feb 20, 2005 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Neue Version 1.37 für WIndows draußen!
http://vertex.art-fx.org/bnet.zip

Bug ist nun gefixed, es lag nämlich an Eof und nicht an Read. Jetzt können größere Dateien heruntergeladen werden(siehe examples/network/download.bmx)

Habe auch mal eine englische Hilfe mit eingefügt. In wie weit mein Englisch korrekt ist, ist die andere Frage Wink

mfg olli
vertex.dreamfall.at | GitHub

regaa

BeitragMo, Feb 21, 2005 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun sofern ich die download.bmx um folgende zeilen erweitert hab

Local zeit:Int=MilliSecs()-1000

und im downloadloop:

Print "Bytes empfangen: "+Size+" "+(Size/((MilliSecs()-zeit)/1000)/1000)+" KB/s"

gab das bei mir 118KB/s

Saubere Arbeit, Olli. Sind nun für Windows alle Befehle wie im Classic Blitz enthalten und keine Bugs mehr?
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Vertex

BeitragMo, Feb 21, 2005 2:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Freut mich zu hören. Hatte als erstes FlushMem vergessen, und mich gewundert warum das immer lahmer wurde. Man könnte das sogar noch optimieren, in dem man Datenpackete in Banks auslagert. Aber 118 KB/s finde ich doch akzeptable. Bei Spielen wird Internet sowiso lahmer sein, als die CPU.

Ich müsste mal noch testen, in wie weit CopyStream standardmäßig mit BlitzClassic kompatibel ist, ansonsten sind alle Befehle vorhanden (bis auf DirectPlay natürlich). Bugfreiheit kann ich natürlich nicht garantieren, jedoch ist das schon eine sehr stabile Version.

Werde mir mal noch Zeit nehmen, und jeden Befehl einen Elchtest unterziehen.

mfg olli
vertex.dreamfall.at | GitHub

Suco-X

Betreff: ........

BeitragMo, Feb 21, 2005 3:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal meine kleine Modifikation zum Download Sample. Läuft bei mir ~400 MS Schneller als die andere Variante. Ich weiss es jetzt nicht so genau. Müsste StreamSize bei dem Download Beispiel die Dateigröße zurückgeben?
Ich teste die Lib jedenfalls weiter aus. Wie immer gute Arbeit Vertex.


Code: [AUSKLAPPEN]

Print StreamSize(TCP)
File = WriteFile(OutFile)

Local time = MilliSecs()

While Not Eof(TCP)
   CopyBytes(TCP,File,1024)
   Size:+1024
   Print Size+" Bytes loaded"
Wend

Print "Zeit: "+(millisecs()-time)
CloseFile(OutFile)



Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Jolinah

BeitragDo, März 10, 2005 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs jetzt auch mal ausprobiert und muss sagen echt super Arbeit! Smile


Hatte nen TCP Server geschrieben welcher auch zu funktionieren scheint.
Beim zugehörigen Client hab ich allerdings ein kleines Problem:

Code: [AUSKLAPPEN]

   If Not Eof(tcp)
      Local cmd:Byte = 0
      Try
         cmd = ReadByte(tcp)
      Catch ex:Object
         Notify "Fehler"
      End Try

      Select cmd
         Case 1
            Print "Bla"
         Case 255
            ex = True
            Notify "Kicked by server"
         Default
      End Select
   EndIf   


Da wo ich das Try Catch hab kommts dauernd zu ner Exception, was mach ich da falsch? Wink
Eigentlich versucht es ja nur auszulesen wenn was im Stream ist (not eof).
Aber der landet dauernd da obwohl der Server nur ganz am Anfang was schickt (1), worauf der Client auch richtig das "Bla" ausgibt. Nach dem "Bla" kommen dann ununterbrochen Exceptions. Sieht fast so aus als ob mit dem Eof() was nicht stimmen würde?

Oder hab ich evtl. ne alte Version? Aber ich hab auf den oberen Link geklickt wo 1.37 steht.

Vertex

BeitragFr, März 11, 2005 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Habe das mal mit Eof unter BlitzClassic ausprobiert, und da geht es gütiger Weise auch nicht. ReadAvail sollte man bei der Abfrage benutzen.
mfg olli
vertex.dreamfall.at | GitHub

Jolinah

BeitragFr, März 11, 2005 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah ok, damit funktionierts, danke Smile

Ich hab gesehen du hast aber Eof auch implementiert, sollte das nicht auch funktionieren? Denn in den mitgelieferten Beispielen wird ja auch überall Eof verwendet.

Aber schön wenns mit ReadAvail funktioniert, reicht mir eigentlich auch schon Smile

Von daher nochmal, echt klasse Arbeit!

Vertex

BeitragFr, März 11, 2005 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke mal für den Hinweis, habe noch 2 simple Fehler in Eof gefunden...
http://vertex.art-fx.org/bnet.zip ist die neue 1.38 Version mit verbesserten Eof.

Ja, ReadAvail gibt im eigentlichen die Puffergröße zurück, die man auslesen kann. Eof prüft zusätzlich mit select ob nicht irgendwie ein Fehler aufgetreten ist, basiert letztendlich auch auf ReadAvail.

Ich würde mal sagen, das es jetzt event. auch mit Eof gehen kann.

mfg olli
vertex.dreamfall.at | GitHub

Jolinah

BeitragFr, März 11, 2005 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, werds gleich mal testen.

Edit: Funktioniert. Feine Sache Smile

Vertex

BeitragSa, Mai 07, 2005 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
QuietBloke von bb.com hatte noch ein fehler beim Testen mit Telnet gefunden:
Code: [AUSKLAPPEN]
Graphics 640,480,0

main ()
End

Function main()
   Local svrGame
   Local strStream
   
   
   svrGame = CreateTCPServer(6000)
   
   While Not KeyHit(1)
      strStream = AcceptTCPStream(svrGame)
      
      If strStream Then
         WriteString(strStream,"Im busy. Come back later" )
         CloseTCPStream(strStream)
      End If

      Delay 500
   Wend
   
End Function


"Im busy. Come back later" wurde zwar zu Telnet übetragen, aber die Verbindung blieb so lange offen, bis der Server selbst geschlossen wurde.

Bug wurde gefixed:
http://vertex.art-fx.org/bnet.zip <- 1.89

Wers testen will:
Start -> Ausführen -> "cmd" -> "Telnet 127.0.0.1 6000"

mfg olli
vertex.dreamfall.at | GitHub

D2006

Administrator

BeitragMo, Mai 16, 2005 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~

Ein Modul gehört ins Modul Forum. Ich habe es gestern vergessen.
D2006

Vertex

BeitragSa, Mai 21, 2005 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
So, es gab noch einen Bug mit CountHostIPs. Danke hier an Wave vom bb.com Forum der mich darauf aufmerksam gemacht hat!

http://vertex.art-fx.org/bnet.zip <- Die neue Version mit gefixten Bug!

mfg olli
vertex.dreamfall.at | GitHub

Vertex

BeitragSa, Mai 28, 2005 1:30
Antworten mit Zitat
Benutzer-Profile anzeigen
So neuer Bug gefunden in Eof und gefixed!

Es ist nun so, wenn man ein Server erstellt, und ein Klient die Verbindung abbricht, das dann Eof -1 zurück liefert. Das war vorher nicht so. Bei BlitzBasic hat man leider nicht die Mögichkeit die Verbindung zu checken ist aber anscheinend auch ein Bug.

Zur Erleuterung (ausgehend bei Klienten mit AcceptTCPClient):
Eof = 0 -> Es können Daten ausgelesen werden
Eof = 1 -> Es können keine Daten ausgelen werden
Eof = -1 -> Verbidung abgebrochen

http://vertex.art-fx.org/bnet.zip <- Version 1.41

Danke hier an IonPainter, der mich darauf aufmerksam gemacht hat!

Hier zum testen:
Code: [AUSKLAPPEN]
Strict

Type THTTPClient
   Global List : TList
   
   Field Stream : TTCPClient
End Type

Global Server     : TTCPServer
Global Client     : TTCPClient
Global HTTPClient : THTTPClient

THTTPClient.List = CreateList()

Server = CreateTCPServer(80)
If Server = Null Then RuntimeError "Konnte Server nicht erstellen!"

TCPTimeouts(0, 1000)

Repeat
   Client = AcceptTCPStream(Server)
   If Client <> Null Then
      HTTPClient = New THTTPClient
      HTTPClient.Stream = Client
      THTTPClient.List.AddLast(HTTPClient)
      Print "New client!: "+DottedIP(TCPStreamIP(Client))
   EndIf
   
   For HTTPClient = EachIn THTTPClient.List
      If Eof(HTTPClient.Stream) = -1 Then
         Print "Client disconnected!: "+DottedIP(TCPStreamIP(HTTPClient.Stream))
         THTTPClient.List.Remove(HTTPClient)
         Continue
      EndIf
     
     
      While Not HTTPClient.Stream.Eof()
         Print DottedIP(TCPStreamIP(HTTPClient.Stream))+" "+..
               ReadLine(HTTPClient.Stream)
      Wend
   Next
   Print "..."
Forever


Wenn man jetzt im Firefox localhost bzw. 127.0.0.1 eingibt, und dann auf Stop klickt(im Firefox noch), dann steht im output von bmax "Client disconnected!: 127.0.0.1"

mfg olli
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am Sa, Mai 28, 2005 1:31, insgesamt einmal bearbeitet

rema

BeitragSa, Mai 28, 2005 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Super gemacht. Aber das Programm arbeitet unter Windows anders als unter Linux. Hast du den Quellcode von der Linux-Modul auch angepasst? Da unter Linux V1.38 und Windows 1.41 steht.

Vertex

BeitragSa, Mai 28, 2005 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Linux-Code hat noch die alten Fehler drin. Das Linuxmodul ist eigentlich nur nativ vorhanden, da sich Winsock und Berkley Sockets sehr ähneln. Problem liegt einfach darin, dass ich BMax nicht unter Knoppix zum laufen bringe, ich somit BNet nicht damit testen kann. Die ganzen Tutorials im Internet beziehen sich zudem auch nur auf Winsock.

Wenn mir jemand sagt, welche Knoppixversion ich mir ziehen muss, damit BMax läuft, nur her damit. Intel 82915G/GV/910GL Express Chipset Family ist die Onboard-Grafikkarte.

mfg olli
vertex.dreamfall.at | GitHub

Vertex

BeitragDo, Jul 14, 2005 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
http://vertex.art-fx.org/bnet.zip <- neue Betaversion für Linux und MacOS!

Dank BigMichi der mich über ein Remotecontrol die letzten Tage unter Linux programmieren lassen hat, habe ich jetzt eine Betaversion heraus gegeben.

Ob das unter MacOS laufen wird, kann ich halt nur vermuten. Habe den kompletten Quellcode von der Linuxversion genommen und die FIONREAD Konstante abgeändert.

Ansonsten ist es jetzt notwendig mit Framework Pub.BNet zu arbeiten! Das liegt daran, das es nun das Socketmodul von Mark standardmäßig gibt, das z. B. auch DottedIP als Funktion anbietet. Um nicht in Konflikt zu kommen, bitte immer Framework benutzen.

So, jetzt seit ihr gefragt. Funktionieren die Beispiele?

mfg olli
vertex.dreamfall.at | GitHub
 

Inkubus

BeitragDo, Jul 21, 2005 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe Probiert mit BNet mal auf Irc zu connecten.
Aber nach kurzer idle zeit trennt er die verbindung.
So ca 5 sekunden.

Vielleicht kennt ja einer ne Lösung

Hier der Code:

Code: [AUSKLAPPEN]
Strict

Framework Pub.BNet

Import Brl.retro
Import Brl.StandardIO
Import Brl.FileSystem
'Import Brl.Max2D


Const GX:Int = 800
Const GY:Int = 600

'Graphics GX, GY, 0

Const Port:Int = 6667
Const Server:String = "irc.quakenet.org"

Global Name:String = Input("Wie ist dein Nickename? ")
Global Channel:String = Input ("Welechen Channel soll ich Joinen? (Ohne #) ")
Global Email:String

Global TCP:Int, RecvLine:String

TCP = OpenTCPStream(Server, Port)
If TCP = 0 Then
   RuntimeError "Konnte keine Verbindung aufbauen"
EndIf

While Not Eof(TCP)
   
   RecvLine = ReadLine(TCP)
   Print RecvLine
   
   
   If Left(RecvLine, 4) = "PING" Then
      Senden "PONG" + Replace(RecvLine, "PING", "")
   End If
   
   If Instr(RecvLine, "376") Then
      Senden "JOIN #"+Channel
   End If
   
   If Instr(RecvLine, "Checking Ident") Then
   
      ' Sende Benutzer Daten
      
      Senden "USER "+ Lower(Name) +" tolmoon tolsun :Gehhilfe BBMax Bot"
      Senden "NICK "+ Name
      
   EndIf
   
Wend

CloseTCPStream TCP
FlushMem

End

Function Senden (str:String)
   WriteLine TCP, str
   Print "["+ Name +"]"+str
End Function

Jolinah

BeitragDo, Jul 21, 2005 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Also erstens musst du dich gleich zu Beginn mit USER und NICK anmelden, unabhängig davon ob in der Zeile ein Checking Ident steht (denn das kommt normalerweise erst wenn man schon angemeldet ist).

Und der Grund warum du wahrscheinlich sofort wieder raus fliegst:
Die Schleife ist nicht so gut. Du kannst nicht erwarten dass vom Server ununterbrochen Daten ankommen. Das heisst du musst eine normale Schleife machen die mit Esc oder sonst wie beendet wird. Da prüfst du dann ob Daten da sind, und wenn ja wertest du sie aus. Wenn keine da sind arbeitet die Schleife dann auch weiter und beendet nicht gleich das Programm.

Und am Ende des Programmes müsstest du dem Server noch QUIT <message> senden, damit der Server auch weiss dass du weg bist. Ansonsten meldet der Server den anderen Usern immer ein Ping Timeout.

Edit: Ich empfehle dir das hier Wink http://www.irchelp.org/irchelp/rfc/rfc2812.txt

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group