📄 cliect.cpp
字号:
#include "cliect.h"
Cliect::~Cliect()
{
}
Cliect::Cliect()
{
}
BOOL Cliect::InitCliect(HWND hwnd)
{
sck_cliect = NULL;
m_hEvent = CreateEvent( NULL,0,0,0 );
hWnd = hwnd;
memset(m_Zero,0,100);
memset(m_cBuffer,0,DATA_BUFSIZE);
if(sck_cliect == NULL)
{
WSADATA t_wsaData;
WSAStartup(MAKEWORD(2,2),&t_wsaData);
return TRUE;
}
return FALSE;
}
BOOL Cliect::CreateCliect(TCHAR *IP)
{
sockaddr_in t_sServAddr;
memset(&t_sServAddr, 0, sizeof(sockaddr_in));
t_sServAddr.sin_family = AF_INET;
t_sServAddr.sin_addr.s_addr = inet_addr( IP );
t_sServAddr.sin_port = htons( 6666 );
sck_cliect = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
//设置缓冲区为0
int t_iZero = 1024*18;
if(setsockopt(sck_cliect, SOL_SOCKET,SO_SNDBUF,(char*)&t_iZero,sizeof(t_iZero))==SOCKET_ERROR)
{
MessageBox(NULL,"setsockopt","setsockopt",NULL);
}
//连接
int err = connect( sck_cliect, (struct sockaddr *)&t_sServAddr,sizeof(t_sServAddr) );
if( err == SOCKET_ERROR ){
return false;
}
// 设置异步通讯
if( WSAEventSelect( sck_cliect, m_hEvent, FD_READ|FD_CLOSE ) == SOCKET_ERROR )
{
return false;
}
DWORD t_dwThreadId;
//创建线程
HANDLE t_hThread;
t_hThread = CreateThread(
NULL, 0, Cliect::ThreadFunc, this, 0, &t_dwThreadId
);
if( t_hThread )
{
CloseHandle(t_hThread);
return true;
}
return false;
}
DWORD WINAPI Cliect::ThreadFunc(LPVOID lpVoid)
{
Cliect *SG_c = (Cliect*)lpVoid;
HANDLE t_hTemp = SG_c->m_hEvent;
while(1) // 网络消息循环
{
DWORD err = WaitForMultipleObjects(1, &t_hTemp, false, INFINITE);
if( err-WAIT_OBJECT_0 == 1 )
{
break; // 结束线程
}
WSANETWORKEVENTS SocketEvents;
try
{
// 枚举网络事件
DWORD ret = WSAEnumNetworkEvents(SG_c->sck_cliect,
SG_c->m_hEvent, &SocketEvents);
if( SocketEvents.lNetworkEvents != 0 )
{
// 接受网络连接请求(Server)
switch( SocketEvents.lNetworkEvents )
{
case FD_READ:
{
SG_c->RecvBuf();
}
break;
case FD_CLOSE:
{
break;
SG_c->Disconnect();
}
break;
default:
break;
}
}
}
catch(...)
{
static DWORD oldtime = 0;
DWORD newtime = timeGetTime();
if( newtime - oldtime >= 60000 )
{
oldtime = newtime;
}
}
Sleep(0); // 释放线程控制权
}
return 0;
}
int Cliect::RecvBuf()
{
int err,t_iSize;
t_iSize = 0;
//清空缓冲区
memset( m_cBuffer, 0, DATA_BUFSIZE );
//接收包SIZE
err = recv( sck_cliect,(char*)&m_cBuffer,DATA_BUFSIZE,0 );
if( err == SOCKET_ERROR )
{
this->Disconnect();
return 0;
}
AnalyseBuf();
/* int t_iLeft = t_iSize;
int t_iIDX = 0;
while ( t_iLeft > 0 )
{
err = recv( sck_cliect,&m_cBuffer[t_iIDX],t_iLeft,0 );
if( err == SOCKET_ERROR )
{
if( WSAEWOULDBLOCK == WSAGetLastError() )
{
Sleep(5);
}
else
{
this->Disconnect();
return 0;
}
}
else
{
t_iLeft -= err;
t_iIDX += err;
}
}*/
//激活接受消息事件
return true;
}
BOOL Cliect::SendBuf(void *a_pBuf, DWORD a_dwLen)
{
if( sck_cliect == NULL ){
return FALSE;
}
send( sck_cliect,(char*)a_pBuf,a_dwLen,0 );
return TRUE;
}
BOOL Cliect::Disconnect()
{
WSACleanup();
closesocket( sck_cliect );
CloseHandle( m_hEvent );
sck_cliect = NULL;
Sleep(0);
return true;
}
void Cliect::AnalyseBuf()
{
char *head, *tail;
head = m_cBuffer;
if(m_Zero[0] != NULL)
{
char buf[DATA_BUFSIZE];
strcpy(buf,m_Zero);
strcat(buf,m_cBuffer);
strcpy(m_cBuffer,buf);
memset(m_Zero,0,100);
}
while(1)
{
tail = strstr(head,"|");
if(tail == NULL)
{
if(m_Zero[0] == NULL)
strcpy(m_Zero,head);
else if(m_Zero[0] != NULL)
strcat(m_Zero,head);
break;
}
char *Command = new char[100];
memset(Command,0,100);
++ tail;
strncpy(Command,head,tail - head);
SendMessage(hWnd,CLIECT_MSG_RECV,(WPARAM)Command,NULL);
head = tail;
if(head == NULL)
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -