Tester gesucht

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Vertex

Betreff: Tester gesucht

BeitragSa, Mai 19, 2007 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will eigentlich recht schnell eine Pingfunktion in BNetEx einbasteln damit ich mich dann noch Broadcast zuwenden kann. Deswegen brauche ich ein paar Tester, am besten MacOS und Linux die mal folgenden Code testen:
Code: [AUSKLAPPEN]
Code siehe unten!


Ich sehe vor lauter Little- und BigEndian nämlich nicht mehr durch aber genau das ist bei X86 und PPC der Knackpunkt.

Wenn das ganze geht, dann mal bitte irgendein Zeichen aus "Hello, world!" herausnehmen, dass die Zeichenanzahl ungerade ist und nochmal testen.

Danke!

mfg olli

Edit: Der Code wurde gerade geändert. Bitte nochmal testen Smile

Edit2: Oh man, natürlich gehts immer noch nicht, da ja Linux diese lustigen Signalmasken besitzt. Also war die ganze Anstrengung umsonst und es muss mit pselect weiter gearbeitet werden. Wie ich Linux hasse!!!!
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am So, Mai 20, 2007 14:10, insgesamt 4-mal bearbeitet
 

#Reaper

Newsposter

BeitragSa, Mai 19, 2007 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab den Code mal auf Linux (Ubuntu) getestet. Kam beidesmal nur "Ping failed". Sad

Und wegen Board-/Multicast: Vielleicht darf ich da ja ein wenig helfen? Smile Habe mich schon vor längerem da etwas reingelesen, weil es mich interessiert. Zudem scheint das Multicast besser zu sein, als Broadcast, da Broadcasting nur in IPv4 funktioniert, aber nicht mehr in IPv6 (zur Zeit werden ja scheinbar dennnoch eh beides Unterstützt). Bei Broadcasting musste man einfach nur an die IP 255.255.255.255 was schicken, damit es jeder im Netzwerk empfängt. In IPv6 soll es der IP-Bereich FF00::/8 sein, jetzt weiß ich nur leider nicht, wie man das bitte in eine Dotted-IP-Adresse "umwandelt" Sad Confused
Naja, soviel zu meinem Wissen Wink
(Mir soll ja nicht nachgerufen werden, dass ich garnichts machen würde Wink )


PS: Ein großes Lob an dich, für deine Arbeit! Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Wild-Storm

BeitragSa, Mai 19, 2007 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Dito.
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

BtbN

BeitragSa, Mai 19, 2007 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Du willst eine IPv6-Addresse in eine Dottet-IP machen? Ich glaub du hast da was nicht verstanden.

Und ich bekomme ne Warnung zu sehen:
WARNING: Trying to create a socket of type SOCK_RAW, will fail unless running as root
Allerdings funktioniert es auch als root nicht.
  • Zuletzt bearbeitet von BtbN am Sa, Mai 19, 2007 17:35, insgesamt einmal bearbeitet

Wild-Storm

BeitragSa, Mai 19, 2007 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann starte den code halt als Root?

edit:// hups, hab da was überlesen

edit2:// nein, ich hab zu schnell geantwortet Wink
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875
 

#Reaper

Newsposter

BeitragSa, Mai 19, 2007 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
BORNtobeNAMELESS hat Folgendes geschrieben:
Du willst eine IPv6-Addresse in eine Dottet-IP machen? Ich glaub du hast da was nicht verstanden.

Und ich bekomme ne Warnung zu sehen:
WARNING: Trying to create a socket of type SOCK_RAW, will fail unless running as root
Allerdings funktioniert es auch als root nicht.


Ok, dann nehm ich alles zurück und behaupte das Gegenteil Crying or Very sad

Naja.. dann frag ich mal besser nix zu IPv6, wie man da überhaupt was versendet o.ä... Embarassed
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Vertex

BeitragSa, Mai 19, 2007 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke fürs Testen!

Ja, man braucht Rootrechte um zu Pingen. Böses ICMP, böse! Wink

Nunja, auch mit Rootrechten gehts nicht dank dieser Zeile:
Code: [AUSKLAPPEN]
setsockopt_(Socket, SOL_SOCKET_, SO_RCVTIMEO, Varptr(Timeout), 4)


Keine Ahnung, errno kann ich nicht einbinden, perror als Funktion spuckt mir auch keine Nachricht aus. Wenn man die ganze Abfrage auskommentiert gehts(aber halt ohne Timeout Wink )

Das kotzt mich doch schon wieder tierisch an. Warum muss jedes OS eine Extrawurst wieder spielen? Demnächst wird nur noch für Windows entwickelt und basta!

Und 255.255.255.255 ist Limited Broadcast, der Spaß wird also nicht vom Router weitergeleitet. Für Broadcasting braucht man die Netzwerkmaske(ist auch noch mal so ein Mist an die heran zu kommen. Bei Linux direkt über ioctl unter Windows über irgendwelche anderen GetIPTable oder so etwas)

mfg olli
vertex.dreamfall.at | GitHub
 

Dreamora

BeitragSa, Mai 19, 2007 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
oder einfach aus spass 255.255.255.0 annehmen da die meisten eh net manuell konfigurieren und das DHCP standard ist unter Windows ^^
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Vertex

BeitragSo, Mai 20, 2007 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin langsam wieder auf den richtigen Weg. Habe mir jetzt ganz einfach mal den Sourcecode von Linux besorgt und in sock.c geschaut:

Code: [AUSKLAPPEN]
int sock_setsockopt(struct socket *sock, int level, int optname,
                    char __user *optval, int optlen)
{
   // ...
   if(optlen<sizeof(int))
      return(-EINVAL);
     
   if (get_user(val, (int __user *)optval))
      return -EFAULT;
   
   valbool = val?1:0;

   lock_sock(sk);

   switch(optname)
   {
      // ...
      case SO_RCVTIMEO:
         ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen);
         break;
      // ...
   }
   // ..
}


Code: [AUSKLAPPEN]
static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
{
   struct timeval tv;

   if (optlen < sizeof(tv))
      return -EINVAL;
   if (copy_from_user(&tv, optval, sizeof(tv)))
      return -EFAULT;

   *timeo_p = MAX_SCHEDULE_TIMEOUT;
   if (tv.tv_sec == 0 && tv.tv_usec == 0)
      return 0;
   if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT/HZ - 1))
      *timeo_p = tv.tv_sec*HZ + (tv.tv_usec+(1000000/HZ-1))/(1000000/HZ);
   return 0;
}


Wie es aussieht, braucht SO_RCVTIMEO also eine Structure vom Typ timeval unter Linux und unter Windows reicht einfach ein einfacher Integer.

Achja, und die Konstanten in Pub.StdC sind schon wieder falsch. Die sind nur für Windows gültig unter Linux(und sicher auch unter MacOS) haben die wiederum andere Werte.

Nun, dann werde ich mich mal ransetzen Evil or Very Mad
vertex.dreamfall.at | GitHub

Vertex

BeitragSo, Mai 20, 2007 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry für Doppelpost, aber ich habe glaube ich geschafft:

linux.c
Code: [AUSKLAPPEN]
#include <sys/select.h>
#include <signal.h>

int pselect_(int ReadCount,   int *ReadSockets,
             int WriteCount,  int *WriteSockets,
             int ExceptCount, int *ExceptSockets,
             int Milliseconds)
{
   int      Index, High, Result;
   fd_set   ReadSet, WriteSet, ExceptSet;
   struct   timespec Timeout;
   sigset_t SignalMask;

   High = -1;

   FD_ZERO(&ReadSet);
   for(Index = 0; Index < ReadCount; Index++)
   {
      FD_SET(ReadSockets[Index], &ReadSet);
      if(ReadSockets[Index] > High) High = ReadSockets[Index];
   }

   FD_ZERO(&WriteSet);
   for(Index = 0; Index < WriteCount; Index++)
   {
      FD_SET(WriteSockets[Index], &WriteSet);
      if(WriteSockets[Index] > High) High = WriteSockets[Index];
   }

   FD_ZERO(&ExceptSet);
   for(Index = 0; Index < ExceptCount; Index++)
   {
      FD_SET(ExceptSockets[Index], &ExceptSet);
      if(ExceptSockets[Index] > High) High = ExceptSockets[Index];
   }

   Timeout.tv_sec  = Milliseconds/1000;
   Timeout.tv_nsec = (Milliseconds%1000)*1000000;

   sigfillset(&SignalMask);
   
   Result = pselect(High + 1, &ReadSet, &WriteSet, &ExceptSet, &Timeout, &SignalMask);
   if(Result == -1) return Result;

   for(Index = 0; Index < ReadCount; Index++)
   {
      if(!FD_ISSET(ReadSockets[Index], &ReadSet)) ReadSockets[Index] = 0;
   }

   for(Index = 0; Index < WriteCount; Index++)
   {
      if(!FD_ISSET(WriteSockets[Index], &WriteSet)) WriteSockets[Index] = 0;
   }

   for(Index = 0; Index < ExceptCount; Index++)
   {
      if(!FD_ISSET(ExceptSockets[Index], &ExceptSet)) ExceptSockets[Index] = 0;
   }

   return Result;
}


Code: [AUSKLAPPEN]
SuperStrict

Framework Pub.StdC
?Linux
   Import "linux.c"
?

?Win32
   Global selectex_:Int(ReadCount:Int, ReadSockets:Int Ptr, ..
                        WriteCount:Int, WriteSockets:Int Ptr, ..
                        ExceptCount:Int, ExceptSockets:Int Ptr, ..
                        Milliseconds:Int) = select_
?MacOS
   Global selectex_:Int(ReadCount:Int, ReadSockets:Int Ptr, ..
                        WriteCount:Int, WriteSockets:Int Ptr, ..
                        ExceptCount:Int, ExceptSockets:Int Ptr, ..
                        Milliseconds:Int) = select_
?Linux
   Extern "C"
      Function selectex_:Int(ReadCount:Int, ReadSockets:Int Ptr, ..
                             WriteCount:Int, WriteSockets:Int Ptr, ..
                             ExceptCount:Int, ExceptSockets:Int Ptr, ..
                             Milliseconds:Int) = "pselect_"
   End Extern
?


Extern "OS"
   Const INVALID_SOCKET_ : Int = -1
   Const SOCK_RAW_       : Int = 3
   Const IPPROTO_ICMP    : Int = 1

   ?Win32
      Const SOL_SOCKET_ : Int = $FFFF

      Function inet_addr_:Int(Address$z) = "inet_addr@4"
      Function GetCurrentProcessId:Int() = "GetCurrentProcessId@0"

   ?MacOS
      Const SOL_SOCKET_ : Int = $FFFF

      Function inet_addr_:Int(Address$z) = "inet_addr"
      Function GetCurrentProcessId:Int() = "getpid"

   ?Linux
      Const SOL_SOCKET_ : Int = 1

      Function inet_addr_:Int(Address$z) = "inet_addr"
      Function GetCurrentProcessId:Int() = "getpid"
   ?
End Extern

Type TICMP
   Field _Type     : Byte
   Field Code      : Byte
   Field Checksum  : Short
   Field ID        : Short
   Field Sequence  : Short

   Function BuildChecksum:Short(Buffer:Short Ptr, Size:Int)
      Local Checksum:Long

      While Size > 1
         Checksum :+ Buffer[0]
         Buffer :+ 1
         Size :- 2
      Wend
      If Size Then Checksum :+ (Byte Ptr(Buffer))[0]

      Checksum = (Checksum Shr 16) + (Checksum & $FFFF)
      Checksum :+ Checksum Shr 16
      Return htons_(~Checksum)
   End Function
End Type

Const ICMP_ECHOREPLY   : Byte = 0
Const ICMP_UNREACHABLE : Byte = 3
Const ICMP_ECHO        : Byte = 8

Const ICMP_CODE_NETWORK_UNREACHABLE : Byte = 0
Const ICMP_CODE_HOST_UNREACHABLE    : Byte = 1

Function Ping:Int(RemoteIP:Int, Data:Byte Ptr, Size:Int, Sequence:Int = 0, ..
                  Timeout:Int = 5000)
   Local Socket:Int, ProcessID:Int, ICMP:TICMP, Buffer:Byte Ptr, ..
         Temp:Int, Start:Int, Stop:Int, Result:Int, SenderIP:Int, SenderPort:Int, ..
         IPSize:Int

   Socket = socket_(AF_INET_, SOCK_RAW_, IPPROTO_ICMP)
   If Socket = INVALID_SOCKET_ Then Throw("Socket konnte nicht erstellt werden")

   ProcessID = GetCurrentProcessID()

   ICMP = New TICMP
   ICMP._Type     = ICMP_ECHO
   ICMP.Code      = 0
   ICMP.Checksum  = 0
   ICMP.ID        = ProcessID
   ICMP.Sequence  = Sequence

   Buffer = MemAlloc(65536)
   MemCopy(Buffer, ICMP, 8)
   MemCopy(Buffer + 8, Data, Size)
   Short Ptr(Buffer)[1] = htons_(TICMP.BuildChecksum(Short Ptr(Buffer), 8 + Size))

   Temp = Socket
   If (selectex_(0, Null, 1, Varptr(Temp), 0, Null, 0) <> 1) Or ..
      (sendto_(Socket, Buffer, 8 + Size, 0, RemoteIP, 0) = SOCKET_ERROR_) Then
      MemFree(Buffer)
      closesocket_(Socket)
      Throw("ICMP Echo Request konnte nicht gesendet werden")
   EndIf

   Start = MilliSecs()
   Repeat
      Temp = Socket
      If selectex_(1, Varptr(Temp), 0, Null, 0, Null, Timeout) <> 1 Then
         MemFree(Buffer)
         closesocket_(Socket)
         Throw("Socket ist nicht bereit zum Empfangen -> Timeout")
      EndIf

      Result = recvfrom_(Socket, Buffer, 65536, 0, SenderIP, SenderPort)
      Stop = MilliSecs()
      If Result = SOCKET_ERROR_ Then
         MemFree(Buffer)
         closesocket_(Socket)
         Throw("Fehler beim Empfang")
      EndIf

      ?X86
         IPSize = (Buffer[0] & $0F)*4
      ?PPC
         IPSize = (Buffer[0] & $F0)*4
      ?
      MemCopy(ICMP, Buffer + IPSize, 8)

      If ICMP.ID <> ProcessID Then
         Continue
      ElseIf ICMP._Type = ICMP_UNREACHABLE Then
         If ICMP.Code = ICMP_CODE_HOST_UNREACHABLE Or ..
            ICMP.Code = ICMP_CODE_NETWORK_UNREACHABLE Then
            MemFree(Buffer)
            closesocket_(Socket)
            Throw("Host oder Netzwerk nciht erreichbar")
         EndIf
      ElseIf ICMP.Code = ICMP_ECHOREPLY Then
         Exit
      EndIf
   Forever

   MemFree(Buffer)
   closesocket_(Socket)

   Return Stop - Start
End Function

Function IntIP:Int(IP:String)
   Return htonl_(inet_addr_(IP))
End Function

Function GetHostIP:Int(HostName:String)
   Local Addresses:Byte Ptr Ptr, AddressType:Int, AddressLength:Int
   Local PAddress:Byte Ptr, Address:Int

   Addresses = gethostbyname_(HostName, AddressType, AddressLength)
   If (Not Addresses) Or AddressType <> AF_INET_ Or AddressLength <> 4 Then Return 0

   If Addresses[0] Then
      PAddress = Addresses[0]
      Address = (PAddress[0] Shl 24) | (PAddress[1] Shl 16) | ..
                (PAddress[2] Shl 8) | PAddress[3]
      Return Address
   Else
      Return 0
   EndIf
End Function

Global RemoteIP : Int, ..
       Message  : String, ..
       Data     : Byte Ptr, ..
       Result   : Int

RemoteIP = GetHostIP("google.com")
If Not RemoteIP Then
   WriteStdout("Host not found~n")
   End
EndIf

Message = "Hello, world!"
Data = Message.ToCString()

Try
   Result = Ping(RemoteIP + 200, Data, Message.Length)
   WriteStdout("Ping tooks " + Result + "ms~n")
Catch Exception:Object
   WriteStdout("Error:~n " + Exception.ToString())
End Try

MemFree(Data)
End


Muss wieder über pselect sein sonst fickt die Signalmaske recvfrom.

Jetzt müsste nur noch mal unter MacOS getestet werden.

mfg olli
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am Mo, Mai 21, 2007 0:12, insgesamt einmal bearbeitet

mahe

BeitragSo, Mai 20, 2007 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
MacOSX 10.4.9 (Intel CPU): Ping failed
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

Vertex

BeitragMo, Mai 21, 2007 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke! Wärst du so nett um das ganze nochmal zu testen? Ich habs mal mit Exceptions angereichert, um zu sehen, wo der Fehler auftritt.
vertex.dreamfall.at | GitHub

mahe

BeitragMo, Mai 21, 2007 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Gleiches System wie zuvor:

Code: [AUSKLAPPEN]
Building test
Compiling:test.bmx
Linking:test.debug
Executing:test.debug
Error:
 Socket konnte nicht erstellt werden
Process complete
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

Vertex

BeitragMo, Mai 21, 2007 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmals Danke! Ja, unter MacOS benötigt man also auch Rootrechte(das Ding basiert doch auf BSD was wiederum mal auf Unix basierte?)
vertex.dreamfall.at | GitHub

BtbN

BeitragMo, Mai 21, 2007 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Die tatsache, dass man für RAW-Sockets root-rechte benötigt scheint eine eigenheit der Berkley-Sockets zu sein, die überall gillt.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group