Tester gesucht
Übersicht

![]() |
VertexBetreff: Tester gesucht |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich hab den Code mal auf Linux (Ubuntu) getestet. Kam beidesmal nur "Ping failed". ![]() Und wegen Board-/Multicast: Vielleicht darf ich da ja ein wenig helfen? ![]() ![]() ![]() Naja, soviel zu meinem Wissen ![]() (Mir soll ja nicht nachgerufen werden, dass ich garnichts machen würde ![]() PS: Ein großes Lob an dich, für deine Arbeit! ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dito. | ||
Visit http://www.next-dimension.org
------------------------------------------------- Freeware Modelle, Texturen & Sounds: http://www.blitzforum.de/forum...hp?t=12875 |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann starte den code halt als Root?
edit:// hups, hab da was überlesen edit2:// nein, ich hab zu schnell geantwortet ![]() |
||
Visit http://www.next-dimension.org
------------------------------------------------- Freeware Modelle, Texturen & Sounds: http://www.blitzforum.de/forum...hp?t=12875 |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Naja.. dann frag ich mal besser nix zu IPv6, wie man da überhaupt was versendet o.ä... ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke fürs Testen!
Ja, man braucht Rootrechte um zu Pingen. Böses ICMP, böse! ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
vertex.dreamfall.at | GitHub |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
MacOSX 10.4.9 (Intel CPU): Ping failed | ||
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ, |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die tatsache, dass man für RAW-Sockets root-rechte benötigt scheint eine eigenheit der Berkley-Sockets zu sein, die überall gillt. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group