Sign in to follow this  
Followers 0
j0kky

Whois problem

7 posts in this topic

#1 ·  Posted (edited)

Hi guys,

I've tried some difficults realizing a simple whois from whois.radb.net. I've tried to query "-i origin AS32934", the right way to retrieve all FB IPs (as developer page says) but I really don't understand what is wrong with my script:

$ws = DllOpen("ws2_32.dll")
TCPStartup()
$ip = TCPNameToIP("whois.radb.net")
$socket = TCPConnect($ip, 43)
TCPSend($socket, "-i origin AS32934")
Local $text

While 1
    $recv = TCPRecv($socket, 2048)
    If @error Then
        $aRet = DllCall($ws, "int", "WSAGetLastError")
        MsgBox(0,$recv,$aRet[0])
        ExitLoop
    EndIf
    If $recv <> "" Then
        $text &= $recv
    EndIf
WEnd
ConsoleWrite(@CRLF & $text & @CRLF)
TCPCloseSocket($socket)
TCPShutdown()

The loops ends as soon as TCPRecv is called... and WSAGetLastError reports no error! :(

Thanks to all

Edited by j0kky

Share this post


Link to post
Share on other sites



Some news: I've downloaded a sniffer and I've seen that the outgoing packet containing "-i origin AS32934" is sent to the right ip, but no packets is received. I've tried to do a whois to Verisign too but same story...

Maybe is it a problem about my network? No!

I've downloaded a whois command line executable (from nirsoft) and that tool works without problem.

I think there is some problem with TCPRecv.

Share this post


Link to post
Share on other sites

TCPRecv()should be fixed in the next version.

Try this for now:

While 1
    $recv = TCPRecv($socket, 2048)
    If (@error < -1) Or (@error > 0) Then

Make yourself sheep and the wolves will eat you - Benjamin Franklin

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

Actually, the better way to do it is:

While 1
    $recv = TCPRecv($socket, 2048)
    If @error Then
        $aRet = DllCall($ws, "int", "WSAGetLastError")
        If @error Or ($aRet[0] <> 0) Then ExitLoop
    EndIf
Edited by ripdad

Make yourself sheep and the wolves will eat you - Benjamin Franklin

Share this post


Link to post
Share on other sites

Your code doesn't work, I think the correct line is

If @error And @error <> -1 Then 

(In the same time you posted I was reading this thread), I think the better solution to solve TCPRecv bug is:

$ws = DllOpen("ws2_32.dll")
TCPStartup()
$ip = TCPNameToIP("whois.radb.net")
$socket = TCPConnect($ip, 43)
TCPSend($socket, "-i origin AS32934")
Local $text, $t = TimerInit()

While 1
    $recv = TCPRecv($socket, 2048)
    If @error And @error <> -1 Then
        $aRet = DllCall($ws, "int", "WSAGetLastError")
        MsgBox(0,$recv,$aRet[0])
        ExitLoop
    EndIf
    If $recv <> "" Then
        $text &= $recv
    EndIf
    If TimerDiff($t) > 9999 Then ExitLoop
WEnd
ConsoleWrite(@CRLF & $text & @CRLF)
TCPCloseSocket($socket)
TCPShutdown()

However it doesn't work at all with whois.radb.net, while if I try to connect to whois.verisign-grs.com, WSAGetLastError reports 10054 error: "Connection reset by peer", probably because of the timeout... Can you run with your pc this last script first with whois.radb.net and then with whois.verisign-grs.com?

Share this post


Link to post
Share on other sites

I found the solution: just add a @crlf after the request of TCPSend()

The final code is:

Local $host = "whois.radb.net", $query = "-i origin AS32934" & @CRLF
TCPStartup()
$ip = TCPNameToIP($host)
$socket = TCPConnect($ip, 43)
TCPSend($socket, $query)
Local $text = "", $t = TimerInit(), $i = 0
While $i < 200
$recv = TCPRecv($socket, 2048)
If @error And @error <> -1 Then
ExitLoop
EndIf
if $recv <> "" Then $text &= $recv
Sleep(10)
$i += 1
WEnd
ConsoleWrite($text & @CRLF)
TCPCloseSocket($socket)
TCPShutdown()

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • DrAhmed
      By DrAhmed
      I am working on a code of  Client-Server Connection for a while (Like Teamviewer) , the problem is that the server keeps disconnecting and connecting all the time , In the client i wrote a code to notify me each time server is online , I am getting around 10 notifications each 1 minute from same server :
      This is the server code :
      TCPStartup() Local $ConnectedSocket Local $My_IP = "127.0.0.1" Local $My_PORT = '5000' Local $UserID = "MyID" ; Connect Connect($My_IP, $My_PORT) While 1 If TCPConnect($My_IP, $My_PORT) <> -1 Then $recv = TCPRecv($ConnectedSocket, 2048) $RecvSpl = StringSplit($recv, "|") Switch $RecvSpl[1] Case "order1" ; Do something MsgBox(64,"Success","You are now connected to the client") AddLogToClinet("My server is Online", $UserID, "Green") EndSwitch Else $Connected = False Connect($IP, $My_PORT) EndIf Sleep(100) WEnd ; Connect To the Client Func Connect($IP, $Port) Local $iConnectAttempts = 0 TCPStartup() Do $ConnectedSocket = TCPConnect($IP, $Port) Sleep(1000) Until ($ConnectedSocket > 0 or $iConnectAttempts > 10) Return SetError(@error, 0, $ConnectedSocket) EndFunc ;==>Connect ; Send To Client Func SockSend($Cmd, $Text) TCPSend($ConnectedSocket, $Cmd & $SockSpl & $Text & $PocketSpl, 4) EndFunc ;==>SockSend ; Add Log To Server Func AddLogToClinet($Data, $UserID, $Color) SockSend("AddLog", $Data & $SockSpl & $UserID & $SockSpl & $Color) EndFunc ;==>AddLogToClinet At first the Connection function was : 
      ; Connect To the Client ( Old ) Func Connect($IP, $Port) TCPStartup() $ConnectedSocket = TCPConnect($IP, $Port) If @error Then Connect($IP, $My_PORT) ; <<<<<<<<<<<<<<< This was the causing recursion error Else $Connected = True EndIf EndFunc ;==>Connect It was working  good , except I had 'recursion level has been exceeded  error (old one)

       I've tried  increasing the delay for current code by :
      Opt("TCPTimeout", 5000) However it did not help yet what do you suggest to me ?
       
    • funkey
      By funkey
      Hello, I just made another TCP server. I will use the server for data collection and a lot of clients can get the data from TCP. I now use it for UDP broadcast some devices to get their IP's. You can also use it for chat's.
      It is very low level, but so you have more options than with the pure AutoIt functions.
      Just start the server in SciTE to see the console outputs. Then you can start up to 63 clients to talk to the server.

      I hope you like it.

      Server script:

      #include "socket_UDF.au3" ;funkey 2013.06.21 _WSAStartup() Global $iSocket Global $iReturn Global $iPort = 20500 Global $sIP_Connected Global $iPort_Connected Global $tBuffer = DllStructCreate("char buffer[512]") $iSocket = _socket($AF_INET, $SOCK_STREAM, $IPPROTO_TCP) ConsoleWrite("Listen Socket: " & $iSocket & @CRLF) Global $tReUse = DllStructCreate("BOOLEAN reuse") DllStructSetData($tReUse, "reuse", True) ; enable reusing the same port $iReturn = _setsockopt($iSocket, $SOL_SOCKET, $SO_REUSEADDR, $tReUse) ; set reusing option for the port If $iReturn Then ConsoleWrite("SetSockOpt error setting reusing the same port!. Windows Sockets Error Codes: " & _WSAGetLastError() & @CRLF) EndIf $iReturn = _bind($iSocket, @IPAddress1, $iPort) ;local IP-Address and port to use If $iReturn Then ConsoleWrite("Bind error: " & $iReturn & @CRLF) ; 0 is OK EndIf $iReturn = _listen($iSocket, 1) If $iReturn Then ConsoleWrite("Listen error: " & $iReturn & @CRLF) ; 0 is OK EndIf Global $iNewSocket Global $tReadFds = DllStructCreate($tagFd_set) Global $tReadFds_Copy = DllStructCreate($tagFd_set) _FD_ZERO($tReadFds) _FD_SET($iSocket, $tReadFds) Global $iSocketMax = $iSocket Global $iSocketNow Global $sDataRcv While 1 DllCall('ntdll.dll', 'none', 'RtlMoveMemory', 'struct*', $tReadFds_Copy, 'struct*', $tReadFds, 'ULONG_PTR', DllStructGetSize($tReadFds)) $iReturn = _select($iSocketMax + 1, $tReadFds_Copy, 2000) ;timeout 2 seconds If _FD_ISSET($iSocket, $tReadFds_Copy) Then $iNewSocket = _accept($iSocket, $sIP_Connected, $iPort_Connected) _FD_SET($iNewSocket, $tReadFds) _FD_SHOW($tReadFds) If $iNewSocket > $iSocketMax Then $iSocketMax = $iNewSocket ConsoleWrite("New connected socket: " & $iNewSocket & @TAB & "IP: " & $sIP_Connected & @TAB & "Port: " & $iPort_Connected & @LF) EndIf For $i = 2 To DllStructGetData($tReadFds, "fd_count") $iSocketNow = DllStructGetData($tReadFds, "fd_array", $i) If _FD_ISSET($iSocketNow, $tReadFds_Copy) Then DllCall('ntdll.dll', 'none', 'RtlZeroMemory', 'struct*', $tBuffer, 'ULONG_PTR', DllStructGetSize($tBuffer)) If _recv($iSocketNow, $tBuffer) = $SOCKET_ERROR Then _closesocket($iSocketNow) _FD_CLR($iSocketNow, $tReadFds) Else $sDataRcv = DllStructGetData($tBuffer, 1) ConsoleWrite("Data received: " & $sDataRcv & @LF) If $sDataRcv == "CloseServer!" Then ExitLoop 2 EndIf EndIf EndIf Next WEnd For $i = 1 To DllStructGetData($tReadFds, "fd_count") _closesocket(DllStructGetData($tReadFds, "fd_array", $i)) Next _WSACleanup() Func _FD_SHOW(ByRef $tFd_set) For $i = 1 To DllStructGetData($tFd_set, "fd_count") ConsoleWrite($i & ":" & @TAB & DllStructGetData($tFd_set, "fd_array", $i) & @LF) Next EndFunc ;==>_FD_SHOW socket_UDF and example.rar
    • matwachich
      By matwachich
      Hi everybody!
      I wanted to learn winsockets, and for this, I try to reproduce AutoIt's TCP functions.
      My code is working pretty good!
      I juste want somebody, an AutoIt dev, to look my code and tell me if I'm doing something wrong, or something need to be done differently.
      Another problem, is that when I close a socket on one side of a connection, the recv functions in the other side doesn't detect the close action! (like TCPRecv would return an @error)
      Thanks in advance!
      (I compile it with GCC 4x)
      Here is the code
      #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #define WINVER 0x0501 #define _WIN32_WINNT 0x0501 #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <iphlpapi.h> #include <stdio.h> #include <stdlib.h> /* -------------------------------------------------------------------------- */ #define SIMPLE_TCP_BUILD_DLL #include "simpletcp.h" /* -------------------------------------------------------------------------- */ #define CHECK_INIT if (_global_ == NULL) return; #define CHECK_INIT_RET(ret) if (_global_ == NULL) return ret; #define SET_ERR(func) sprintf(_global_->err_func, "%s", func); _global_->err = WSAGetLastError(); #define UNSET_ERR sprintf(_global_->err_func, "%s", ""); _global_->err = 0; /* -------------------------------------------------------------------------- */ typedef struct { WSADATA wsaData; char err_func[20]; int err; } simple_tcp_t; simple_tcp_t* _global_ = NULL; /* -------------------------------------------------------------------------- */ /* Standard functions */ /** \brief * * \return */ int SIMPLE_TCP TCPStartup () { if (_global_ != NULL) { return 1; } _global_ = malloc(sizeof(simple_tcp_t)); if (_global_ == NULL) { return 0; } if (WSAStartup(MAKEWORD(2, 2), &_global_->wsaData) != 0) { free(_global_); _global_ = NULL; return 0; } UNSET_ERR return 1; } /** \brief * * \return */ void SIMPLE_TCP TCPShutdown () { if (_global_ == NULL) { return; } WSACleanup(); free(_global_); _global_ = NULL; } /** \brief * * \param * \param * * \return */ int SIMPLE_TCP TCPGetError (char* err_func, const size_t err_func_len) { CHECK_INIT_RET(0) int err = _global_->err; if (err_func != NULL && err_func_len > 0) { snprintf(err_func, err_func_len, "%s", _global_->err_func); } UNSET_ERR return err; } /** \brief * * \param * \param * * \return */ int SIMPLE_TCP TCPConnect (const char* host, const char* port) { CHECK_INIT_RET(0) UNSET_ERR struct addrinfo hints, *result = NULL; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; // IP v4 hints.ai_socktype = SOCK_STREAM; // Stream socket hints.ai_protocol = IPPROTO_TCP; // TCP if (getaddrinfo(host, port, &hints, &result) != 0) { SET_ERR("getaddrinfo") return 0; } SOCKET ConnectSocket = INVALID_SOCKET; ConnectSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { freeaddrinfo(result); SET_ERR("socket") return 0; } if (connect(ConnectSocket, result->ai_addr, (int)result->ai_addrlen) != 0) { freeaddrinfo(result); SET_ERR("connect") return 0; } freeaddrinfo(result); unsigned long mode = 1; if (ioctlsocket(ConnectSocket, FIONBIO, &mode) != 0) { SET_ERR("ioctlsocket") return 0; } return ConnectSocket; } /** \brief * * \param * * \return */ int SIMPLE_TCP TCPListen (const char* port) { CHECK_INIT_RET(0) UNSET_ERR struct addrinfo hints, *result = NULL; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; // IP v4 hints.ai_socktype = SOCK_STREAM; // Stream socket hints.ai_protocol = IPPROTO_TCP; // TCP hints.ai_flags = AI_PASSIVE; // this + node = NULL => local host IP if (getaddrinfo(NULL, port, &hints, &result) != 0) { SET_ERR("getaddrinfo") return 0; } SOCKET ListenSocket = INVALID_SOCKET; ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { freeaddrinfo(result); SET_ERR("socket") return 0; } unsigned long mode = 1; if (ioctlsocket(ListenSocket, FIONBIO, &mode) != 0) { freeaddrinfo(result); SET_ERR("ioctlsocket") return 0; } if (bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen) != 0) { freeaddrinfo(result); SET_ERR("bind") return 0; } freeaddrinfo(result); if (listen(ListenSocket, SOMAXCONN) != 0) { SET_ERR("listen") return 0; } return ListenSocket; } /** \brief * * \param * * \return */ int SIMPLE_TCP TCPAccept (int socket) { CHECK_INIT_RET(0) UNSET_ERR int err; SOCKET ClientSocket = INVALID_SOCKET; ClientSocket = accept(socket, NULL, NULL); err = WSAGetLastError(); if (ClientSocket == INVALID_SOCKET && err != WSAEWOULDBLOCK) { SET_ERR("accept") return INVALID_SOCKET; } if (ClientSocket != INVALID_SOCKET) { unsigned long mode = 1; if (ioctlsocket(ClientSocket, FIONBIO, &mode) != 0) { SET_ERR("ioctlsocket") return INVALID_SOCKET; } } return ClientSocket; } /** \brief * * \param * * \return */ int SIMPLE_TCP TCPCloseSocket (int socket) { CHECK_INIT_RET(0) UNSET_ERR if (shutdown(socket, SD_BOTH) != 0) { SET_ERR("shutdown") return 0; } if (closesocket(socket) != 0) { SET_ERR("closesocket") return 0; } return 1; } /** \brief * * \param * \param * \param * * \return */ int SIMPLE_TCP TCPSend (int socket, const char* data, const size_t data_len) { CHECK_INIT_RET(0) UNSET_ERR int ret = send(socket, data, data_len, 0); if ((ret == SOCKET_ERROR || ret == 0) && WSAGetLastError() != WSAEWOULDBLOCK) { SET_ERR("send") return 0; } return ret; } /** \brief * * \param * \param * \param * * \return */ int SIMPLE_TCP TCPRecv (int socket, char* data, const size_t data_len) { CHECK_INIT_RET(0) UNSET_ERR int ret = recv(socket, data, data_len, 0); if ((ret == 0 || ret == SOCKET_ERROR) && WSAGetLastError() != WSAEWOULDBLOCK) { SET_ERR("recv") return 0; } return ret; } /** \brief * * \param * \param * \param * * \return */ int SIMPLE_TCP TCPNameToIP (const char* name, char* ip, const size_t ip_len) { CHECK_INIT_RET(0) UNSET_ERR struct addrinfo hints, *result = NULL; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; // IP v4 hints.ai_socktype = SOCK_STREAM; // Stream socket hints.ai_protocol = IPPROTO_TCP; // TCP if (getaddrinfo(name, NULL, &hints, &result) != 0) { SET_ERR("getaddrinfo") return 0; } if (result->ai_family != AF_INET || result->ai_addrlen != sizeof(struct sockaddr_in)) { SET_ERR("bad address family") freeaddrinfo(result); return 0; } struct sockaddr_in* addr = (struct sockaddr_in*)result->ai_addr; char* ret = inet_ntoa(addr->sin_addr); snprintf(ip, ip_len, "%s", ret); freeaddrinfo(result); return 1; } /** \brief * * \param * \param * \param * * \return */ int SIMPLE_TCP TCPSocketToIP (int socket, char* ip, const size_t ip_len) { CHECK_INIT_RET(0) UNSET_ERR struct sockaddr_in addr_in; int len = sizeof(addr_in); if (getpeername(socket, (struct sockaddr*)&addr_in, &len) != 0) { SET_ERR("getpeername") return 0; } char* ret = inet_ntoa(addr_in.sin_addr); if (ret == NULL) { SET_ERR("inet_ntoa") return 0; } snprintf(ip, ip_len, "%s", ret); return 1; } and the header
      #ifndef __SIMPLE_TCP_H__ #define __SIMPLE_TCP_H__ #ifdef SIMPLE_TCP_BUILD_DLL #define SIMPLE_TCP __stdcall __declspec(dllexport) #else #define SIMPLE_TCP __stdcall __declspec(dllimport) #endif /* -------------------------------------------------------------------------- */ /* Standard functions */ int SIMPLE_TCP TCPStartup (); void SIMPLE_TCP TCPShutdown (); int SIMPLE_TCP TCPGetError (char* err_func, const size_t err_func_len); int SIMPLE_TCP TCPConnect (const char* ip, const char* port); int SIMPLE_TCP TCPListen (const char* port); int SIMPLE_TCP TCPAccept (int socket); int SIMPLE_TCP TCPCloseSocket (int socket); int SIMPLE_TCP TCPSend (int socket, const char* data, const size_t data_len); int SIMPLE_TCP TCPRecv (int socket, char* data, const size_t data_len); int SIMPLE_TCP TCPNameToIP (const char* name, char* ip, const size_t ip_len); int SIMPLE_TCP TCPSocketToIP (int socket, char* ip, const size_t ip_len); #endif // __SIMPLE_TCP_H__