Jump to content

Search the Community

Showing results for tags 'wsa'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • General
    • Announcements and Site News
    • Administration
  • AutoIt v3
    • AutoIt Help and Support
    • AutoIt Technical Discussion
    • AutoIt Example Scripts
  • Scripting and Development
    • Developer General Discussion
    • Language Specific Discussion
  • IT Administration
    • Operating System Deployment
    • Windows Client
    • Windows Server
    • Office

Categories

  • AutoIt Team
    • Beta
    • MVP
  • AutoIt
    • Automation
    • Databases and web connections
    • Data compression
    • Encryption and hash
    • Games
    • GUI Additions
    • Hardware
    • Information gathering
    • Internet protocol suite
    • Maths
    • Media
    • PDF
    • Security
    • Social Media and other Website API
    • Windows
  • Scripting and Development
  • IT Administration
    • Operating System Deployment
    • Windows Client
    • Windows Server
    • Office

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Member Title


Location


WWW


Interests

Found 2 results

  1. WSA_NBTCP.au3 (Windows Sockets API - Non-Blocking Transmission Control Protocol) Version: 1.00 Type: UDF This is an accumulation of WSA code from many sources and modified to suit myself. These functions have been thoroughly tested using a Local Proxy Server, which is about the most strenuous test you can use. Includes my rendition of how a TCPRecv Timeout should work. Also includes a timewait/timeout using Select for TCP Send, which works great for that function. You will need a loop to use _WSA_TCPRecv(). An example will be forthcoming in a second post. Functions: #CURRENT_USER_FUNCTIONS _WSA_Cleanup _WSA_FormatMessage _WSA_GetLastError _WSA_TCPAccept _WSA_TCPCloseSocket _WSA_TCPConnect _WSA_TCPListen _WSA_TCPRecv _WSA_TCPSend #INTERNAL_FUNCTIONS __TimeoutManager __TimeoutReset #EXTRA_FUNCTIONS _WSA_GetAddrInfo _WSA_GetHostByAddr _WSAAsyncGetHostByName _WSAAsyncGetHostByName_Callback _WSA_GetNameInfo Requirements: - AutoIt Versions: 3.3.8.1 thru 3.3.15.0 (32Bit only). - TCPStartup() at beginning of script on startup. - TCPShutDown() and _WSA_Cleanup() on exit. Download UDF: WSA_NBTCP.au3
  2. 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__
×
×
  • Create New...