diff options
Diffstat (limited to 'devtools/smtpmail/simplesocket.cpp')
| -rw-r--r-- | devtools/smtpmail/simplesocket.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/devtools/smtpmail/simplesocket.cpp b/devtools/smtpmail/simplesocket.cpp new file mode 100644 index 0000000..da2d9a0 --- /dev/null +++ b/devtools/smtpmail/simplesocket.cpp @@ -0,0 +1,162 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: simple TCP socket API for communicating as a TCP client over a TEXT +// connection +// +// $Workfile: $ +// $Date: $ +// +//----------------------------------------------------------------------------- +// $Log: $ +// +// $NoKeywords: $ +//=============================================================================// + +#include <winsock.h> + +#include "simplesocket.h" + + +static REPORTFUNCTION g_SocketReport = NULL; + +//----------------------------------------------------------------------------- +// Purpose: intialize sockets +//----------------------------------------------------------------------------- +void SocketInit( void ) +{ + WSADATA wsData; + + WORD wVersionRequested = MAKEWORD(1, 1); + WSAStartup(wVersionRequested, &wsData); +} + + +//----------------------------------------------------------------------------- +// Purpose: cleanup all socket resources +//----------------------------------------------------------------------------- +void SocketExit( void ) +{ + WSACleanup(); +} + + +//----------------------------------------------------------------------------- +// Purpose: sets up a reporting function +// Input : *pReportFunction - +//----------------------------------------------------------------------------- +void SocketReport( REPORTFUNCTION pReportFunction ) +{ + g_SocketReport = pReportFunction; +} + + +//----------------------------------------------------------------------------- +// Purpose: Open a TCP socket & connect to a given server +// Input : *pServerName - server name (text or ip) +// port - port number of the server +// Output : HSOCKET +//----------------------------------------------------------------------------- +HSOCKET SocketOpen( const char *pServerName, int port ) +{ + SOCKADDR_IN sockAddr; + SOCKET s; + + memset(&sockAddr,0,sizeof(sockAddr)); + + s = socket( AF_INET, SOCK_STREAM, 0 ); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_addr.s_addr = inet_addr(pServerName); + + if (sockAddr.sin_addr.s_addr == INADDR_NONE) + { + LPHOSTENT lphost; + lphost = gethostbyname(pServerName); + if (lphost != NULL) + { + sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr; + } + else + { + WSASetLastError(WSAEINVAL); + return FALSE; + } + } + + sockAddr.sin_port = htons((u_short)port); + + if ( connect( s, (SOCKADDR *)&sockAddr, sizeof(sockAddr) ) == SOCKET_ERROR ) + { +// printf("Socket error:%d\n", WSAGetLastError()) ; + return NULL; + } + + return (HSOCKET)s; +} + + +//----------------------------------------------------------------------------- +// Purpose: close the socket opened with SocketOpen() +// Input : socket - +//----------------------------------------------------------------------------- +void SocketClose( HSOCKET socket ) +{ + SOCKET s = (SOCKET)socket; + closesocket( s ); +} + + +//----------------------------------------------------------------------------- +// Purpose: Write a string to the socket. String is NULL terminated on input, +// but terminator is NOT written to the socket +// Input : socket - +// *pString - string to write +//----------------------------------------------------------------------------- +void SocketSendString( HSOCKET socket, const char *pString ) +{ + if ( !pString ) + return; + + int len = (int)strlen( pString ); + + if ( !len ) + return; + + if ( send( (SOCKET)socket, pString, len, 0 ) != SOCKET_ERROR ) + { + if ( g_SocketReport ) + { + g_SocketReport( socket, pString ); + } + } + else + { +// printf("Send failed\n"); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: receive input from a socket until a certain string is received +// ASSUME: socket data is all text +// Input : socket - +// *pString - string to match, if NULL, just poll the socket once +//----------------------------------------------------------------------------- +void SocketWait( HSOCKET socket, const char *pString ) +{ + char buf[1024]; + + bool done = false; + while ( !done ) + { + int len = recv( (SOCKET)socket, buf, sizeof(buf)-1, 0 ); + buf[len] = 0; + if ( g_SocketReport ) + { + g_SocketReport( socket, buf ); + } + if ( !pString || strstr( buf, pString ) ) + return; + } +} + |