amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > tcp -> richtige Programmierung [ - Search - New posts - Register - Login - ]

-1- 2 [ - Post reply - ]

2007-06-28, 21:47 h

Ralf27
Posts: 2779
User
Dank euch kann ich ja inzwischen auch mit dem inet-handler auf der Internet zugreifen und Dateien runterladen. Dies läuft auch recht gut. Allerdings benötigt das allerding TCP:, was ja nicht von jedem Stack gleich installiert wird. Somit hab ich das Problem, das damit meine Programme die auf TCP: zugreifen bei anderen ins Leere greifen und nicht laufen. Und dann müßte der User eben denn inet-handler installieren und starten, was ja auch einen gewissen Aufwand bedeutet und nicht gerade geschickt ist.
Also brauch ich dazu eine Lösung des Problem:
* entweder ich programmiere das ganze direkt ohne TCP:
* oder ich muß irgendwie aus dem Programm raus TCP: starten, wenn es nicht läuft.

Die erste Lösung wäre wohl die bessere, allerdings hab ich keine Ahnung wie ich das am besten machen könnte. Ich hab mir auch mal die AMarque (vermutlich falsch geschrieben) angesehn, wurde aber quasi von Befehlen erschlagen, bzw. hab keine Ahnung wie ich da vorgehn muß :glow: .

Also, wie könnte ich am besten direkt ohne denn inet-handler an die Dateien im Internet?
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-06-29, 10:56 h

Micha1701
Posts: 938
User
Hi!

Ich hab auch mal versucht ein wenig mit dem Internet zu arbeiten. Hierfür habe ich dann direkt die bsdSocket.library verwendet. Damit kannste entsprechende Verbindungen ins Netz aufbauen und Dateien anfordern.

Bei dem SDK sind auch Beispiele dabei. War gar nicht so schwer eine Verbindung aufgebaut zu bekommen. Vielleicht find ich noch den Code und kann ihn die geben, wenn Du willst...

--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Answer - Quote - Direct link - ]

2007-06-29, 12:34 h

tboeckel
Posts: 124
User
@Ralf27:

YAM deckt mittlerweile so gut wie alles ab: Grafik, GUI, Netzwerk, etc. Den kompletten Source gibt es hier. Alles was mit TCP/IP und SSL zu tun hat wird hier behandelt.

[ - Answer - Quote - Direct link - ]

2007-06-29, 13:18 h

Holger
Posts: 8116
User
Zitat:
Original von tboeckel:
Alles was mit TCP/IP und SSL zu tun hat wird hier behandelt.


und alles andere offenbar auch. Nunja, vielleicht findet Ralf ja in den 7000 Zeilen Code das, was er braucht.

Aber Respekt, dass Ihr mit solch einer "Modularisierung" die Weiterentwicklung von YAM in diesem Tempo vorantreiben könnt.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-06-29, 19:59 h

Ralf27
Posts: 2779
User
Zitat:
Original von Holger:
und alles andere offenbar auch. Nunja, vielleicht findet Ralf ja in den 7000 Zeilen Code das, was er braucht.


Nun, die Wahrscheinlichkeit das ich im Lotto gewinne ist höher und dabei tippe ich nicht mal.

Hm, wo könnte man ein einfach, kleines Beispiel bekommen? I-) :D
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-01, 18:40 h

Holger
Posts: 8116
User
BASIC code:
REM $Nolibrary
REM $Nolines
REM $NoOverflow
REM $NOEVENT

DEFINT A-Z

CONST AF_INET% = 2
CONST PF_INET% = 2
CONST SOCK_STREAM% = 1

'$underlines
LIBRARY DECLARE "bsdsocket.library"
DECLARE FUNCTION Socket&(domain%,type%,protocol%) LIBRARY
DECLARE FUNCTION Connect&(fd&,addr&,addrLen%) LIBRARY
DECLARE FUNCTION Send&(fd&,bufAddr&,bufLen&,flags&) LIBRARY
DECLARE FUNCTION Recv&(fd&,bufAddr&,bufLen&,flags&) LIBRARY
DECLARE FUNCTION GetHostByName&(NAME&) LIBRARY
DECLARE FUNCTION CloseSocket&(fd&) LIBRARY
LIBRARY OPEN "bsdsocket.library"

FUNCTION quote$(header$,source$)
  STATIC s$
  s$=""
  FOR i%=1 TO LEN(source$)
    c$=MID$(source$,i%,1)
    a%=ASC(c$)
    IF a%=10 THEN
      PRINT header$+CHR$(34)+s$+CHR$(34)
      s$=""
    ELSEIF a%<32 OR a%=34 THEN
      s$=s$+""+OCT$(a%)
    ELSE
      s$=s$+c$
    END IF
  NEXT
  IF LEN(s$)>0 THEN PRINT header$+CHR$(34)+s$+CHR$(34)
  quote$=s$
END FUNCTION

FUNCTION SendStr&(BYVAL d&, BYVAL a$)
  PRINT quote$("SENDING: ", a$)
  SendStr&=Send(d&,SADD(a$),LEN(a$),0)
END FUNCTION

FUNCTION RecvStr$(d&)
  STATIC buf$,num&,res$
  buf$=STRING$(100, " ")
  num&=Recv(d&,SADD(buf$),LEN(buf$),0)
  IF num&<0 THEN
    res$=""
  ELSE
    res$=LEFT$(buf$,num&)
    PRINT quote$("RECEIVED: ", res$)
  END IF
  RecvStr$=res$
END FUNCTION

DIM address%(8)
address%(0) = AF_INET%
address%(1) = 80       :REM Port 80 == http
IF LOCAL% THEN
  address%(2) = 127 << 8 :REM 127.0...
  address%(3) = 1        :REM ...0.1
ELSE
  hostent& = GetHostByName&(SADD("amiga-news.de"+CHR$(0)))
  addrSize& = PEEKL(hostent&+12)
  addrType& = PEEKL(hostent&+8)
  IF addrSize&<>4 OR addrType&<>AF_INET% THEN
    PRINT "Unknown address type ";addrType&;" (";addrSize&;" bytes)"
    END
  END IF
  aPtr&=PEEKL(PEEKL(hostent&+16))
  address%(2) = PEEKW(aPtr&)
  address%(3) = PEEKW(aPtr&+2)
END IF

fd&=Socket&(PF_INET%, SOCK_STREAM%, 0)
IF fd&<>-1 THEN
  a&=VARPTR(address%(0))
  ? "Connecting to ";PEEK(a&+4);".";PEEK(a&+5);".";PEEK(a&+6);".";PEEK(a&+7)
  res&=Connect(fd&, a&, 16)
  IF NOT res& THEN
    totalSent&=0
    totalRecv&=0
    totalSent&=totalSent&+SendStr&(fd&, "GET / HTTP/1.0"+CHR$(10)+CHR$(10))
    r$="Start"
    WHILE r$<>""
      r$=RecvStr$(fd&)
      totalRecv&=totalRecv&+LEN(r$)
    WEND
    PRINT
    PRINT "Sent ";totalSent&;" bytes, received ";totalRecv&"; bytes"
  ELSE
    PRINT "Couldn't connect"
  END IF
ELSE
  PRINT "Failed to create Socket"
END IF
x&=CloseSocket&(fd&)

END


EDIT: Fehlende Konstante hinzugefügt.
EDIT: Amigaspezifisches CloseSocket hinzugefügt.

[ Dieser Beitrag wurde von Holger am 01.07.2007 um 21:51 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2007-07-01, 19:29 h

Ralf27
Posts: 2779
User
wow, danke!

Aber kurz mal ne Frage: hast du die bmap generiert oder gibt es diese schon im Aminet? Ich hab hier zwar jetzt alles da(fd), müßte aber das ganze erst noch konvertieren. Aber wenn es das ganze schon gibt, dann müßte ich mir ja nicht die Arbeit machen. Bzw. bmap ist einfach, aber wenn ich schon dabei wäre, dann würde ich auch .bh und .bc generieren.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-01, 20:18 h

Ralf27
Posts: 2779
User
Läuft leider nicht bei mir. Hab mir die bmap selbst generiert (aus der AmiTCP-SDK-4.3) und es läuft soweit, bzw. der Compiler übersetzt es komplett. Allerdings fehlen logischerweise die Konstanten und die sind wirklich weit gestreut im SDK (jedenfalls für mich I-) )

Im obrigen Programm vermisse ich SOCK_STREAM. Deswegen kann wohl keine Verbindung aufgebaut werden.

(Also irgendwann muß ich mal ein Programm schreiben das alle Dateien ab einem gewissen Verzeichnisszweig rekrusiv öffnet und nach gewissen Wörtern sucht ... )
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-01, 20:40 h

Ralf27
Posts: 2779
User
SOCK_STREAM%=1

Habs gefunden, jetzt läuft es komplett, danke!
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-01, 21:20 h

Holger
Posts: 8116
User
Zitat:
Original von Ralf27:
Also irgendwann muß ich mal ein Programm schreiben das alle Dateien ab einem gewissen Verzeichnisszweig rekrusiv öffnet und nach gewissen Wörtern sucht ...


Hmm, welches System benutzt Du denn?
Bei mir öffne ich das Verzeichnis in der Workbench und wähle "Fenster / Suchen" aus dem Menü. Muss zwar dann vor der Suche erstmal die angebotenen Laufwerke als weiter Suchpfade deselektieren und von "Dateiname" auf "Inhalt" stellen, aber brauchbar ist das auf die Schnelle schon, und bevor ich mir selber ein Programm dafür schreibe...

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-07-01, 21:27 h

Ralf27
Posts: 2779
User
Da ist nochwas:
code:
_Close(fd&)


Müßte da nicht ok=CloseSocket(fd&) hin?
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-01, 21:33 h

Ralf27
Posts: 2779
User
Hm, so hab ich ja noch gar nicht gesucht... Stimmt.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-01, 21:41 h

Holger
Posts: 8116
User
Zitat:
Original von Ralf27:
Da ist nochwas:
code:
_Close(fd&)


Müßte da nicht ok=CloseSocket(fd&) hin?

Gerne ;)
Das Beispiel ist halt von ner Unix-like Dokumentation erstellt. Da benutzt man halt close(...). CloseSocket ist amiga-spezifisch, die anderen Funktionen sind es nicht.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-07-01, 23:14 h

Ralf27
Posts: 2779
User
Hab eben die TCP: "Abhängigkeit" vom miniRSS-Reader beseitigt. Und es funktioniert. :bounce:

Bei Sudoku geh ich ja auch über TCP:, allerdings sieht das dort wieder anderst aus, da ich es mir dort nicht erlauben kann zu warten. Ich denke mir mal, das es dort wieder anderst läuft.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-02, 04:31 h

Der_Wanderer
Posts: 1229
User
@Holger

Interessantes Beispiel.
Sieht allerdings so aus, als ob du einen bussy loop hast um auf die Daten zu warten. Kann man auch irgendwoher ein singal flag bekommen, um darauf zu warten ?

Gibt es auch ein Beispiel, mit dem man auf eine anfrage reagieren kann ?
So wie es im Moment ist, könnte man einen Browser schreiben, aber nicht den Server dazu.
Für mich wäre das sehr interessant, für Internet Spiele.
Das obige Beispiel geht natürlich schon in Amiblitz, allerdings das warten auf einem Socket nicht.

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Answer - Quote - Direct link - ]

2007-07-02, 09:52 h

Holger
Posts: 8116
User
Zitat:
Original von Der_Wanderer:
@Holger

Interessantes Beispiel.
Sieht allerdings so aus, als ob du einen bussy loop hast um auf die Daten zu warten.

Nee, in der Form wie oben blocken die Funktionen, bis recv() mind. ein Zeichen empfangen, bzw. send() alle Zeichen gesendet hat.
Zitat:
Kann man auch irgendwoher ein singal flag bekommen, um darauf zu warten ?
Man kann den stream auf non-blocking konfigurieren und dann liefert recv() -1 und Fehler EWOULDBLOCK zurück, wenn noch keine Daten anliegen. Mit select() kann man eine Abfrage über mehrere stream inkl. timeout programmieren. Aber da gibt's ein paar Amiga-spezifische Abweichungen, wie man schon auf den ersten Blick auf's API sehen kann. Ich denk mal, auch ne Benachrichtigung via Amiga-Signale sollte da drin sein.

Bei Gelegenheit versuch ich mal ein Beispiel hinzukriegen, das muss ich aber natürlich auch Testen...
Zitat:
Gibt es auch ein Beispiel, mit dem man auf eine anfrage reagieren kann ?
So wie es im Moment ist, könnte man einen Browser schreiben, aber nicht den Server dazu.


Bei Gelegenheit... :bounce:

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-07-02, 10:08 h

Holger
Posts: 8116
User
Zitat:
Original von Ralf27:
Hab eben die TCP: "Abhängigkeit" vom miniRSS-Reader beseitigt. Und es funktioniert. :bounce:


Hast Du auch berücksichtigt, dass das Beispiel noch keine vernünftige Fehlerbehandlung enthält?

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-07-02, 15:47 h

Ralf27
Posts: 2779
User
Zitat:
Original von Holger:
Hast Du auch berücksichtigt, dass das Beispiel noch keine vernünftige Fehlerbehandlung enthält?


Ja, hab ich, soweit ich das sehn konnte. Ich hab quasi nur die Befehle von der alten Routine verändert. Was zurück kommt ist ja auch das gleiche. Im Endeffekt ist das die gleiche Routine wie wir sie damals hier im Forum zusammengebaut haben, aber halt mit den anderen Lib-Befehlen.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-02, 15:53 h

Ralf27
Posts: 2779
User
Kurz noch eins, bevor ich wieder los muß:

Kann es sein das sich z.b. der Lib-Befehl Send() zwischen den bsdsocket.lib-Version verändert hat? Ich hatte vorher eine wohl ältere fd-Datei die bei der Send() 6 Variablen erwartet hat statt den 4 wie sie hier sind. Hat dann halt nach dem erstellen der bmap-Datei nur Fehler beim compilieren erzeugt.

Also müßte man vorher auch noch auf die Version der bsdsocket.lib testen.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-07-02, 17:41 h

Holger
Posts: 8116
User
Zitat:
Original von Ralf27:
Ja, hab ich, soweit ich das sehn konnte. Ich hab quasi nur die Befehle von der alten Routine verändert. Was zurück kommt ist ja auch das gleiche.

Ja, die Rückgabewerte sind die gleichen, aber was machst Du, wenn -1 zurückgegeben wird? Die bsdsocket-lib hat eigene Funktionen für die Fehlerbehandlung und benutzt andere Fehlercodes als die DOS-Funktionen.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-07-02, 17:43 h

Holger
Posts: 8116
User
Zitat:
Original von Ralf27:
Kann es sein das sich z.b. der Lib-Befehl Send() zwischen den bsdsocket.lib-Version verändert hat? Ich hatte vorher eine wohl ältere fd-Datei die bei der Send() 6 Variablen erwartet hat statt den 4 wie sie hier sind. Hat dann halt nach dem erstellen der bmap-Datei nur Fehler beim compilieren erzeugt.


Kann ich mir nicht vorstellen. Der send() Befehl ist deutlich älter als die ganze bsdsocket.lib. Es gibt noch einen Befehl sendto(), der 6 Parameter erwartet.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-07-02, 18:27 h

Holger
Posts: 8116
User
Hier noch mal das Beispiel mit Fehlerbehandlung:
Basic code:
REM $Nolibrary
REM $Nolines
REM $NoOverflow
REM $NOEVENT

DEFINT A-Z

CONST AF_INET% = 2
CONST PF_INET% = 2
CONST SOCK_STREAM% = 1

'$underlines
LIBRARY DECLARE "bsdsocket.library"
DECLARE FUNCTION Socket&(domain%,type%,protocol%) LIBRARY
DECLARE FUNCTION Connect&(fd&,addr&,addrLen%) LIBRARY
DECLARE FUNCTION Send&(fd&,bufAddr&,bufLen&,flags&) LIBRARY
DECLARE FUNCTION Recv&(fd&,bufAddr&,bufLen&,flags&) LIBRARY
DECLARE FUNCTION GetHostByName&(NAME&) LIBRARY
DECLARE FUNCTION CloseSocket&(fd&) LIBRARY
DECLARE FUNCTION Errno&() LIBRARY
DECLARE SUB      SetErrnoPtr(errno_p&, size%) LIBRARY
LIBRARY OPEN "bsdsocket.library"

FUNCTION quote$(header$,source$)
  STATIC s$
  s$=""
  FOR i%=1 TO LEN(source$)
    c$=MID$(source$,i%,1)
    a%=ASC(c$)
    IF a%=10 THEN
      PRINT header$+CHR$(34)+s$+CHR$(34)
      s$=""
    ELSEIF a%<32 OR a%=34 THEN
      s$=s$+""+OCT$(a%)
    ELSE
      s$=s$+c$
    END IF
  NEXT
  IF LEN(s$)>0 THEN PRINT header$+CHR$(34)+s$+CHR$(34)
  quote$=s$
END FUNCTION

FUNCTION SendStr&(BYVAL d&, BYVAL a$)
  SHARED SockErrNo&
  STATIC res&
  PRINT quote$("SENDING: ", a$)
  res&=Send(d&,SADD(a$),LEN(a$),0)
  IF res&<>LEN(a$) AND SockErrNo& THEN Fail "While sending"
  SendStr&=res&
END FUNCTION

FUNCTION RecvStr$(d&)
  SHARED SockErrNo&
  STATIC buf$,num&,res$
  buf$=STRING$(100, " ")
  num&=Recv(d&,SADD(buf$),LEN(buf$),0)
  IF num&<0 THEN
    IF SockErrNo& THEN Fail "While receiving"
    res$=""
  ELSE
    res$=LEFT$(buf$,num&)
    PRINT quote$("RECEIVED: ", res$)
  END IF
  RecvStr$=res$
END FUNCTION

REM $include socketerr.bas
SetErrnoPtr VARPTR(SockErrNo&), 4
SUB Fail(header$)
  SHARED SockErrNo&
  PRINT header$;": ";SockErrStr$(SockErrNo&)
END SUB

DIM address%(8)
address%(0) = AF_INET%
address%(1) = 80       :REM Port 80 == http
IF LOCAL% THEN
  address%(2) = 127 << 8 :REM 127.0...
  address%(3) = 1        :REM ...0.1
ELSE
  hostent& = GetHostByName&(SADD("amiga-news.de"+CHR$(0)))
  REM hostent& = GetHostByName&(SADD("localhost"+CHR$(0)))
  IF hostent&=0& THEN
    Fail "DNS lookup "+STR$(Errno())
    END
  END IF
  addrSize& = PEEKL(hostent&+12)
  addrType& = PEEKL(hostent&+8)
  IF addrSize&<>4 OR addrType&<>AF_INET% THEN
    PRINT "Unknown address type ";addrType&;" (";addrSize&;" bytes)"
    END
  END IF
  aPtr&=PEEKL(PEEKL(hostent&+16))
  address%(2) = PEEKW(aPtr&)
  address%(3) = PEEKW(aPtr&+2)
END IF

fd&=Socket&(PF_INET%, SOCK_STREAM%, 0)
IF fd&<>-1 THEN
  a&=VARPTR(address%(0))
  ? "Connecting to ";PEEK(a&+4);".";PEEK(a&+5);".";PEEK(a&+6);".";PEEK(a&+7)
  res&=Connect(fd&, a&, 16)
  IF NOT res& THEN
    totalSent&=0
    totalRecv&=0
    totalSent&=totalSent&+SendStr&(fd&, "GET / HTTP/1.0"+CHR$(10)+CHR$(10))
    r$="Start"
    WHILE r$<>""
      r$=RecvStr$(fd&)
      totalRecv&=totalRecv&+LEN(r$)
    WEND
    PRINT
    PRINT "Sent ";totalSent&;" bytes, received ";totalRecv&"; bytes"
  ELSE
    Fail "Couldn't connect"
  END IF
  x&=CloseSocket&(fd&)
ELSE
  Fail "Failed to create Socket"
END IF

END


[ - Answer - Quote - Direct link - ]

2007-07-02, 18:29 h

Holger
Posts: 8116
User
...und die includierte Datei socketerr.bas
BASIC code:
FUNCTION SockErrStr$(BYVAL sErrNo%)
  SockErrStr$="Unknown error "+STR$(sErrNo%)
  SELECT CASE sErrNo%
    CASE  1: SockErrStr$="Operation not permitted "
    CASE  2: SockErrStr$="No such file or directory "
    CASE  3: SockErrStr$="No such process "
    CASE  4: SockErrStr$="Interrupted system call "
    CASE  5: SockErrStr$="Input/output error "
    CASE  6: SockErrStr$="Device not configured "
    CASE  7: SockErrStr$="Argument list too long "
    CASE  8: SockErrStr$="Exec format error "
    CASE  9: SockErrStr$="Bad file descriptor "
    CASE 10: SockErrStr$="No child processes "
    CASE 11: SockErrStr$="Resource deadlock avoided "
    CASE 12: SockErrStr$="Cannot allocate memory "
    CASE 13: SockErrStr$="Permission denied "
    CASE 14: SockErrStr$="Bad address "
    CASE 16: SockErrStr$="Device busy "
    CASE 17: SockErrStr$="File exists "
    CASE 18: SockErrStr$="Cross-device link "
    CASE 19: SockErrStr$="Operation not supported by device "
    CASE 20: SockErrStr$="Not a directory "
    CASE 21: SockErrStr$="Is a directory "
    CASE 22: SockErrStr$="Invalid argument "
    CASE 23: SockErrStr$="Too many open files in system "
    CASE 24: SockErrStr$="Too many open files "
    CASE 25: SockErrStr$="Inappropriate ioctl for device "
    CASE 27: SockErrStr$="File too large "
    CASE 28: SockErrStr$="No space left on device "
    CASE 29: SockErrStr$="Illegal seek "
    CASE 30: SockErrStr$="Read-only file system "
    CASE 31: SockErrStr$="Too many links "
    CASE 32: SockErrStr$="Broken pipe "
    CASE 35: SockErrStr$="Resource temporarily unavailable, Operation would block "
    CASE 36: SockErrStr$="Operation now in progress "
    CASE 37: SockErrStr$="Operation already in progress "
    CASE 38: SockErrStr$="Socket operation on non-socket "
    CASE 39: SockErrStr$="Destination address required "
    CASE 40: SockErrStr$="Message too long "
    CASE 41: SockErrStr$="Protocol wrong type for socket "
    CASE 42: SockErrStr$="Protocol not available "
    CASE 43: SockErrStr$="Protocol not supported "
    CASE 44: SockErrStr$="Socket type not supported "
    CASE 45: SockErrStr$="Operation not supported on socket "
    CASE 46: SockErrStr$="Protocol family not supported "
    CASE 47: SockErrStr$="Address family not supported by protocol family "
    CASE 48: SockErrStr$="Address already in use "
    CASE 49: SockErrStr$="Can't assign requested address "
    CASE 50: SockErrStr$="Network is down "
    CASE 51: SockErrStr$="Network is unreachable "
    CASE 52: SockErrStr$="Network dropped connection on reset "
    CASE 53: SockErrStr$="Software caused connection abort "
    CASE 54: SockErrStr$="Connection reset by peer "
    CASE 55: SockErrStr$="No buffer space available "
    CASE 56: SockErrStr$="Socket is already connected "
    CASE 57: SockErrStr$="Socket is not connected "
    CASE 58: SockErrStr$="Can't send after socket shutdown "
    CASE 59: SockErrStr$="Too many references: can't splice "
    CASE 60: SockErrStr$="Connection timed out "
    CASE 61: SockErrStr$="Connection refused "
    CASE 64: SockErrStr$="Host is down "
    CASE 65: SockErrStr$="No route to host "
    CASE 77: SockErrStr$="No locks available "
    CASE 78: SockErrStr$="Function not implemented "
    CASE 79: SockErrStr$="Inappropriate file type or format "
  END SELECT
END FUNCTION


mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-07-07, 09:36 h

Ralf27
Posts: 2779
User
Also, bis jetzt hatte ich ein einfaches "Netzwerkfehler" stehn, wenn es einen Fehler über das Netzwerk gekommen ist. Aber das man das so weit aufschlüsseln kann.. zja, da geht halt mehr als mit dem TCP: I-)

Danke! Ich hoffe das ich bald mal wieder etwas mehr Zeit und "Wallung" finde das in allen meinen aktuellen Projekte einzubinden und die Übergangslösung "TCP:" zu verwerfen.
Nur bei Sudoku ist das leider so noch nicht möglich, da ja beim Lesen leider gewartet werden muß. Es würde mich auch freuen, wenn du uns auch so eine geniale Lösung zeigen könntest. Ich blick da leider nicht durch die Doku durch die wirklich recht umfangreich ist.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-09-16, 10:52 h

Ralf27
Posts: 2779
User
Ich bin die ganze Zeit am überlegen ob ich das Sudoku-Projekt nicht doch ins Aminet bringen soll. Die ganze Zeit dachte ich, das es dafür noch nicht "reif" wäre. Ich denke aber auch, wenn ich dem Sudoku das TCP: abgewöhnen könnte, dann müßte das Programm eigentlich so langsam dafür herangereift sein(es wäre übrigens mein erster Upload ins Aminet)

Nur, wie ich das dynamische Senden und Empfangen ohne Warten hinbekomme. In der Hinsicht bin ich fast schon wie MaikG.. Das TrailAndError-Verfahren ist aber nicht gerade das Gelbe vom Ei um das irgendwie hin zu bekommen.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2008-01-27, 18:15 h

Ralf27
Posts: 2779
User
Leider bekomme ich das übertragen und empfangen der Packets *ohne* Warten via bsd nicht auf die Reihe. Die Doku ist wirklich übermächtig und als Laie wird man da irgendwie erschlagen.

Ich könnte da echt Eure Hilfe gebrauchen.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2008-02-05, 21:49 h

Ralf27
Posts: 2779
User
Ich beis mich gerade irgendwie selbst durch die Materie und wie es scheint läuft da alles über Select(), wenn ich ohne blockieren lesen möchte. Dazu muß ich auch die einzelnen IDs der Sockets an Select() übergeben und da hab ich jetzt ein Problem mit den Macros:

code:
#define    FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
#define    FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
#define    FD_ISSET(n, p)    ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
#define    FD_ZERO(p)    bzero((char *)(p), sizeof(*(p)))

So steht das für C drin. Ich blick da überhaupt nicht durch wie ich das Array in Basic aufbauen müßte.

Zur Zeit hab ich einen äußerst waagen überblick wie ich das ganze machen müßte. Aber ihr kennt mich, das kann was werden. :D
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2008-02-08, 11:26 h

Holger
Posts: 8116
User
Zitat:
Original von Ralf27:
Ich beis mich gerade irgendwie selbst durch die Materie und wie es scheint läuft da alles über Select(), wenn ich ohne blockieren lesen möchte.


Nein, select() brauchst Du, wenn Du auf mehrere sockets gleichzeitig warten willst. Du musst einen Deskriptor via ioctl auf non-blocking I/O setzen, wenn Du das haben willst. Das ist was ganz anderes.

Siehe http://www.mirbsd.org/htman/i386/man2/ioctl.htm
Zitat:
ioctl(int d, unsigned long request, ...);
...
FIONBIO int
Set non-blocking I/O mode if the argument is non-zero. In non-
blocking mode, read(2) or write(2) calls return -1 and set errno
to EAGAIN immediately when no data is available.


mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2008-02-09, 23:22 h

Ralf27
Posts: 2779
User
Ich hab es eben zum ersten mal geschaft, das ich zwischen einem server und client daten austauschen kann. Eigentlich blockiert recv() gar nicht, wenn keine Daten da sind. Er sendet nur eine NULL zurück und gut ist. Das ist eigentlich ausreichend.

Mal sehn ob ich es schaffe das ganze in Sudoku einzubauen.

PS: Oh, war das heut en Tag. Für die meisten hier ist das wohl recht einfach, für mich war es wirklich nicht einfach mich da durch zu beisen...
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2008-02-10, 14:45 h

Ralf27
Posts: 2779
User
Oh, ich liebe diese Zeilen in C:

code:
#define    FIONBIO        _IOW('f', 126, long)   /* set/clear non-blocking i/o */


Was für ein Wert hat da wohl FIONBIO? :nuke: I-)

Hab eben in Sudoku von tcp: nach bsd gewechselt und jetzt kommen wirklich einige Probleme.. hm. Na, ich kämpf dann mal weiter im Code. :)

PS: recv() blockt, logisch. hm

EDIT:
FIONBIO = &H8004667E

Ich hoffe, das das hin kommt. :)

--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 10.02.2008 um 15:09 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]


-1- 2 [ - Post reply - ]


amiga-news.de Forum > Programmierung > tcp -> richtige Programmierung [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.