⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockfunc.cpp

📁 socket编程
💻 CPP
字号:
#include "stdafx.h"
#include "SockFunc.h"

int g_WaitTime = 0 ;

int g_TryCount = 0 ;

int sock_init( SOCKET * pSocket )
{

	SOCKET	sock				;
	struct	sockaddr_in server	;
	struct	hostent *hp			;
	int		rval				;
	DWORD	dwans				;

	char *	SERV_HOST_ADDR	;	//= "192.168.34.76"	;
	int		SERV_TCP_PORT	;	//= 9000				;

	extern TCHAR g_IniFile[256] ;

	TCHAR	buff_ip[32]		;
	TCHAR	buff_port[32]	;

	ZeroMemory( buff_ip	  , 32 ) ;
	ZeroMemory( buff_port , 32 ) ;

	*pSocket = -1 ;

 	dwans = GetPrivateProfileString(
				_T("HOST"),		// points to section name
				_T("IP"),		// points to key name
				_T(""),			// points to default string
				buff_ip,	// points to destination buffer
				32,         // size of destination buffer
				g_IniFile   // points to initialization filename
			);
 
	if ( dwans <= 0 )
	{
		return -1 ;
	}

	//rval = WideCharToMultiByte(0,0
	SERV_HOST_ADDR = (char*)buff_ip ;

	dwans = GetPrivateProfileString(
				_T("HOST"),     // points to section name
				_T("PORT"),     // points to key name
				_T(""),			// points to default string
				buff_port,  // points to destination buffer
				32,         // size of destination buffer
				g_IniFile   // points to initialization filename
			);
 
	if ( dwans <= 0 )
	{
		return -1 ;
	}

	SERV_TCP_PORT = _ttoi(buff_port);

	if ( SERV_TCP_PORT < 6000 )
	{
		::MessageBox(NULL, _T("The port should be larger than 6000!") , _T("Error") , MB_OK);
		return -1 ;
	}

	dwans = GetPrivateProfileString(
				_T("CLIENT"),       // points to section name
				_T("WAIT_TIME"),    // points to key name
				_T("5"),			// points to default string
				buff_port,		// points to destination buffer
				32,             // size of destination buffer
				g_IniFile       // points to initialization filename
			);
 
	if ( dwans <= 0 )
	{
		return -1 ;
	}

	g_WaitTime = _ttoi(buff_port);

	dwans = GetPrivateProfileString(
				_T("CLIENT"),       // points to section name
				_T("TRY_COUNT"),    // points to key name
				_T("1"),			// points to default string
				buff_port,		// points to destination buffer
				32,             // size of destination buffer
				g_IniFile       // points to initialization filename
			);
 
	if ( dwans <= 0 )
	{
		return -1 ;
	}

	g_TryCount = _ttoi(buff_port);

	unsigned long addr ;

	if (_istalpha(SERV_HOST_ADDR[0])) 
	{ /* server address is a name */
		hp = gethostbyname(SERV_HOST_ADDR);
	}
	else
	{ /* Convert nnn.nnn address to a usable one */
		addr = inet_addr(SERV_HOST_ADDR);
		if ( addr == INADDR_NONE )
		{
			::MessageBox( NULL , _T("socket happen error!") , _T("Error") ,MB_OK);
			return -1 ;
		}

		hp = gethostbyaddr( (char*)&addr, 4 ,  PF_INET ) ;
	}

	if ( hp == NULL ) 
	{
		rval = ::GetLastError() ;

		MessageBox(NULL , _T("can not find this host!") , buff_ip , MB_OK);

		return -1 ;
	}

	sock = socket(PF_INET , SOCK_STREAM , 0);

	if ( sock < 0 )
	{
		return -1 ;
	}

	memset( &server , '\0' , sizeof(server) );

	server.sin_family = PF_INET ;

	server.sin_port = htons(SERV_TCP_PORT) ;

	memcpy( (char*)&server.sin_addr , (char*)hp->h_addr , hp->h_length ) ;

	rval = connect( sock , (struct sockaddr*)&server , sizeof(server) ) ;

	if ( rval < 0 ) 
	{
		rval = ::GetLastError() ;
		closesocket(sock) ;
		return -1 ;
	}

	// enable the blocking mode of socket. 
	ioctlsocket( sock , FIONBIO , (u_long*)0) ; 

	*pSocket = sock ;

	return 0;
}


int sock_send( SOCKET socket , struct PG_HEAD  pghead  , LPTSTR pData )
{
	int rval ;
	struct PG_HEAD	pg_head ;
	char * buff = NULL ;
	int size ;


	pg_head = pghead;
	/*memset( &pg_head , '\0' , sizeof(struct PG_HEAD) ) ;*/

	if ( pData != NULL )
	{
		size = _tcslen(pData) ;
	}
	else
	{
		size = 0;
	}
	pg_head.reqSize = size;
/*
	pg_head.reqType = req_type	;
	pg_head.reqSize = size		;
*/
	TraceLog_send( &pg_head , pData) ;

	pg_head.reqType	= HTONL_MAC(pg_head.reqType) ;
	pg_head.reqSize	= HTONL_MAC(pg_head.reqSize) ;
	pg_head.binType = HTONL_MAC(pg_head.binType) ;

	size = sizeof(struct PG_HEAD) + size ;
	buff = new char[size+1] ;

	memset( buff ,'\0' , size+1 ) ;
	memcpy( buff , &pg_head , sizeof(struct PG_HEAD) ) ;
	memcpy( buff+sizeof(struct PG_HEAD) , pData , size-sizeof(struct PG_HEAD) ) ;

	// enable the blocking mode of socket. 
	ioctlsocket( socket , FIONBIO , (u_long*)0) ; 

	rval = send( socket , buff , size , 0/*MSG_DONTROUTE*/ ) ;

	delete[]buff ;

	if ( rval != size )
	{
		TraceLog( _T("system error , can not send data to server.") ) ;
		return -1 ;
	}

	TraceLog(_T("send the data to server successfully.")) ;

	return 0;
}


int sock_recv( SOCKET socket , struct PG_HEAD * pg_head , LPTSTR &pData )
{
	int rval ;
	
	if ( g_WaitTime > 0 )
	{
			// enable the nonblocking mode of socket. 
			u_long data ;
			rval = ioctlsocket( socket , FIONBIO , (u_long*)&data) ; 
			if ( rval < 0 )
			{
				TraceLog( _T("系统发生错误,ioctlsocket不能成功运行!!!!") ) ;
				return -1 ;
			}

			fd_set fdset ;
			timeval time ;

			FD_ZERO( &fdset ) ;

			FD_SET( socket , &fdset ) ; 

			time.tv_sec  = g_WaitTime ;	// s
			time.tv_usec = 0 ;

			rval = select( 1 , &fdset , (fd_set*)NULL , (fd_set*)NULL , &time ) ;
			if ( rval < 0 )
			{
				TraceLog( _T("系统发生错误,select不能成功运行!!!!") ) ;
				return -1 ;
			}

			rval = FD_ISSET(socket , &fdset)  ;

			if ( rval < 0 )
			{
				TraceLog( _T("系统发生错误,select不能成功运行!!!!") ) ;
				return -1 ;
			}
			else if ( rval == 0 )
			{
				TraceLog( _T("接收数据时,系统发生超时") ) ;
				return 1 ; /* TIME OUT */
			}
	}

	rval = recv( socket , (char*)pg_head , sizeof(struct PG_HEAD) , 0 );

	if ( rval == 0 )
	{
		TraceLog( _T("此次对话已被切断") ) ;
		return 0 ;
	}
	else if( rval != sizeof(struct PG_HEAD) ) 
	{
		TraceLog( _T("系统发生错误,recv不能成功运行!!!!") ) ;
		return -1 ;
	}

	pg_head->reqSize	= NTOTL_MAC(pg_head->reqSize) ;
	pg_head->reqType	= NTOTL_MAC(pg_head->reqType) ;

	if ( pg_head->reqSize > 0 )
	{
		pData = new TCHAR[pg_head->reqSize+1];
		ZeroMemory( pData , pg_head->reqSize+1 ) ;
		//memset( pData , '\0', pg_head->reqSize+1 ) ;

		rval = recv( socket , (char*)pData , pg_head->reqSize , 0 );

		if ( rval == 0 )
		{
			TraceLog( _T("此次对话已被切断") ) ;
			return 0 ;
		}
		else if( rval != pg_head->reqSize ) 
		{
			TraceLog( _T("系统发生错误,recv不能成功运行!!!!") ) ;
			return -1 ;
		}
	}

	TraceLog_recv( pg_head , pData) ;

	return 0 ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -