mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 22:27:05 +00:00
163 lines
4.1 KiB
C++
163 lines
4.1 KiB
C++
|
//========= 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;
|
||
|
}
|
||
|
}
|
||
|
|