Burn Napisano Grudzień 6, 2019 Autor Zgłoś Udostępnij Napisano Grudzień 6, 2019 Witam Może i to dość proste, jednak ja nigdy nie zajmowalem sie programowaniem aplikacji sieciowych przy użyciu WinApi. Czy ktoś może podać przykład jak napisać (oczywiście w WinApi) funkcję która zwróci te informacjie co komenda Ping (W takiej lub podobnej postaci) z tym, że chcę mieć dostęp do poszczególnych zawartych tam informacji. Dobrze by było gdyby można podać nazwę lub adres IP. Pozdro Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Surprise Napisano Grudzień 9, 2019 Zgłoś Udostępnij Napisano Grudzień 9, 2019 Hmmm...kiedyś kiedy jeszcze był dział download, było źródło programu typu ping...napisał je bodajże Dracula, ale nie jestem pewnien...cóż do tego najlepiej wykorzystać protokół udp, jednak nie mam nigdzie gotowej funkcji i czasu (hyh), dlatego dam ci linka do fajnego kursu: https://www.keeller.kompozytor.net/ws_wprowadzenie.php Pozdrawiam Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Freak Napisano Grudzień 9, 2019 Zgłoś Udostępnij Napisano Grudzień 9, 2019 Przez udp chyba sie tego nie da zrobić :) do tego służy protokół ICMP a konkretnie pakiet ECHO REQUEST. https://www.ping127001.com/pingpage/ping.html Tu jest kod źródłowy pinga, co prawda z linuxa, ale sockety są wszędzie takie same :) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Burn Napisano Grudzień 9, 2019 Autor Zgłoś Udostępnij Napisano Grudzień 9, 2019 Dzięki, już sobie poradziłem :) Wszystko działa :) Napisałem (w MASM) to tak: To jest kod modułu ping.inc include wsock32.inc includelib wsock32.lib PingInit PROTO PingClean PROTO Ping PROTO :DWORD,:DWORD,:DWORD,:WORD .const ECHO_PACKET_SIZE equ 32 ;rozmiar pakietu danych PING_INIT_OK equ 0 PING_INIT_ERROR_LOADLIB equ 1 PING_INIT_ERROR_GETPROCADDR equ 2 PING_INIT_ERROR_WSASTARTUP equ 3 PING_INVALID_HOSTNAME equ -1 .data szIcmp db "icmp.dll",0 szIcmpCreateFile db "IcmpCreateFile",0 szIcmpCloseHandle db "IcmpCloseHandle",0 szIcmpSendEcho db "IcmpSendEcho",0 .data? hIcmp dd ? lpIcmpCreateFile dd ? lpIcmpCloseHandle dd ? lpIcmpSendEcho dd ? .code PingInit proc LOCAL wsa: WSADATA invoke LoadLibrary, offset szIcmp cmp eax, 0 je errorloadlib mov hIcmp, eax invoke GetProcAddress, hIcmp, offset szIcmpCreateFile cmp eax, 0 je errorgetprocaddr mov lpIcmpCreateFile, eax invoke GetProcAddress, hIcmp, offset szIcmpCloseHandle cmp eax, 0 je errorgetprocaddr mov lpIcmpCloseHandle, eax invoke GetProcAddress, hIcmp, offset szIcmpSendEcho cmp eax, 0 je errorgetprocaddr mov lpIcmpSendEcho, eax invoke WSAStartup, 0101h, addr wsa cmp eax, 0 jne errorwsastartup sub eax, eax ret errorwsastartup: inc eax ;eax = 3 Error PING_INIT_ERROR_WSASTARTUP errorgetprocaddr: push eax invoke FreeLibrary, hIcmp pop eax inc eax ;eax = 2 Error PING_INIT_ERROR_GETPROCADDR errorloadlib: inc eax ;eax = 1 Error PING_INIT_ERROR_LOADLIB ret PingInit endp PingClean proc invoke WSACleanup invoke FreeLibrary, hIcmp ret PingClean endp Ping proc uses esi lpAddr:DWORD, lpEcho:DWORD, lpOptions:DWORD, TimeOut:WORD LOCAL addrIP: DWORD LOCAL hIcmpFile: DWORD LOCAL acPingBuffer[ECHO_PACKET_SIZE]: BYTE invoke inet_addr, lpAddr mov addrIP, eax .if eax == INADDR_NONE invoke gethostbyname, lpAddr .if eax == 0 dec eax ;eax = -1 PING_INVALID_HOSTNAME ret .endif mov eax, dword ptr [eax + 12] mov eax, dword ptr [eax] mov eax, dword ptr [eax] mov addrIP, eax .endif invoke RtlFillMemory, addr acPingBuffer, ECHO_PACKET_SIZE, 0AAh call lpIcmpCreateFile mov hIcmpFile, eax mov esi, lpEcho assume esi: ptr ICMP_ECHO_REPLY lea eax, acPingBuffer mov [esi].DataPointer, eax mov [esi].DataSize, ECHO_PACKET_SIZE assume esi: nothing push TimeOut push sizeof ICMP_ECHO_REPLY + ECHO_PACKET_SIZE push lpEcho push lpOptions push ECHO_PACKET_SIZE lea eax, acPingBuffer push eax push addrIP push hIcmpFile call lpIcmpSendEcho push eax push hIcmpFile call lpIcmpCloseHandle pop eax ret Ping endp Najpierw wywołuję funkcję PingInit, później Ping i odpowiednio formatuję dane które podaję/otrzymuję no i po wszystkim PingClean. Parametry funkcji Ping to: lpAddr - adres lub nazwa hosta lpEcho - adres zmiennej typu ICMP_ECHO_REPLY (zwraca potrzebne mi informacje) lpOptions - adres zmiennej typu ICMP_OPTIONS (tu podaję niektóre dane np. TTL) TimeOut - max. czas odpowiedzi Wydaje mi się że wszystko działa poprawnie, gdyby jednak ktos zauważył jakiś błąd to proszę o wyjaśnienie co i dlaczego jest źle. Pozdrawiam Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.