📄 sockfunc.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 + -