msocket.cpp

来自「电压监测后台管理程序,数据是通过GPRS传到因特网的」· C++ 代码 · 共 261 行

CPP
261
字号
// mSocket.cpp : implementation file
//

#include "stdafx.h"
#include "rectvinfo.h"
#include "rectvinfoDoc.h"
#include "rectvinfoview.h"

#include "mSocket.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// mSocket
CRectvinfoApp* theApp;

IMPLEMENT_DYNCREATE(mSocket, CWinThread)

mSocket::mSocket()
{
	ServSock = NULL;
}


mSocket::~mSocket()
{
}

BOOL mSocket::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	int i;
	PromptInfo = new UCHAR[20];

	theApp = (CRectvinfoApp*)AfxGetApp();
	SockAddr.sin_addr.S_un.S_addr=INADDR_ANY;//htonl(INADDR_ANY);
	SockAddr.sin_family=AF_INET;
	SockAddr.sin_port=htons(5000);
	addlen=sizeof(SockAddr);
	ServSock=socket(AF_INET,SOCK_STREAM,0);
	if (bind(ServSock,(sockaddr*)&SockAddr,addlen))
	{
		i = WSAGetLastError();
		strcpy((char*)PromptInfo,"绑定错误!");
		::PostMessage(theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(1),LPARAM(PromptInfo));
		return false;
	}
	else
	{
	//	m_list.InsertItem(count++,inet_ntoa(serv.sin_addr));
	//	HWND mainWnd = (HWND)((CRectvinfoApp*)AfxGetApp())->m_pMainWnd;
	//	HWND mainWnd1 = (HWND)AfxGetMainWnd();
		strcpy((char*)PromptInfo,"服务器创建成功!");
		::PostMessage(theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(1),LPARAM(PromptInfo));
		listen(ServSock,SOMAXCONN);
	}

	return TRUE;
}

int mSocket::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here 

/*	for (int i=0;i<MAXCLIENTNUM;i++)
	{
		if (theApp->GetSocket(i)!=NULL)
		{
			closesocket(theApp->GetSocket(i));
			theApp->SetSocket(i,NULL);
		}
	}
*/
//	if (ServSock!=NULL)
//		closesocket(ServSock);
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(mSocket, CWinThread)
	//{{AFX_MSG_MAP(mSocket)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// mSocket message handlers
/*
UINT thread(LPVOID p)
{
	char buff[101];
	CSize size;
	size.cx=0;
	size.cy=30;
	int s,Route,loop=1,flag=0;
	mSocket* mThis = (mSocket*) p;
	Route=mThis->theApp->getcount();
	if (Route==-1)
		loop=0;
	if(loop)
	{
		s=1;
		mThis->theApp->SetSocket(Route,accept(mThis->ServSock,(sockaddr*)&(mThis->SockAddr),&(mThis->addlen)));
		mThis->PromptInfo = new UCHAR[10];
		if (mThis->theApp->GetSocket(Route)==INVALID_SOCKET)
		{
			strcpy((char*)mThis->PromptInfo,"连接错误!");
			::PostMessage(mThis->theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(1),LPARAM(mThis->PromptInfo));
		}
		else
		{
			strcpy((char*)mThis->PromptInfo,"连接成功!");
			::PostMessage(mThis->theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(1),LPARAM(mThis->PromptInfo));
			mThis->theApp->IncreaseConnectedNum();
			::PostMessage(mThis->theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(3),LPARAM(mThis->theApp->GetConnectedNum()));
			AfxBeginThread(&thread,p);
			while((s!=SOCKET_ERROR)&&(s!=0))
			{
				s=recv(mThis->theApp->GetSocket(Route),buff,100,0);
				if ((s!=SOCKET_ERROR)&&(s>0))
				{
					if (s>100) s=100;
					buff[s]=0;
					mThis->PromptInfo = new UCHAR[102];
					strcpy((char*)mThis->PromptInfo,buff);
					::PostMessage(mThis->theApp->formWnd,CONTENT,WPARAM(1),LPARAM(mThis->PromptInfo));
				}
			}

			if (s==SOCKET_ERROR)
				send(mThis->theApp->GetSocket(Route),"Disconnected",100,0);
			closesocket(mThis->theApp->GetSocket(Route));
			mThis->theApp->SetSocket(Route,NULL);
			mThis->theApp->DecreaseConnectedNum();
			::PostMessage(mThis->theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(3),LPARAM(mThis->theApp->GetConnectedNum()));
		}
	}
	AfxEndThread(0);
	return 0;
}
*/

int mSocket::Run() 
{
	// TODO: Add your specialized code here and/or call the base class
	char buff[12],telnum[12];
	CSize size;
	size.cx=0;
	size.cy=30;
	int s,Route,tellen,ti;
	timeval mWaitTime;
	fd_set fdRead,fdWrite;
	bool CanRcvFlag;

	mWaitTime.tv_sec = 0;
	mWaitTime.tv_usec = 0;
	FD_ZERO(&fdRead);
	FD_ZERO(&fdWrite);

	CFrameWnd* pFrameWnd;
	CRectvinfoView * RealView;
	pFrameWnd = (CFrameWnd *)theApp->m_pMainWnd;//将CWnd类指针转化为CFrameWnd类指针
	RealView = (CRectvinfoView *)pFrameWnd->GetActiveFrame()->GetActiveView();//将CView类指针转化为CFormView类指针

	Route = theApp->getcount();
	if(Route >= 0)
	{
		s=1;
		theApp->SetSocket(Route,accept(ServSock,(sockaddr*)&(SockAddr),&(addlen)));
		PromptInfo = new UCHAR[10];
		if (theApp->GetSocket(Route)==INVALID_SOCKET)
		{
			strcpy((char*)PromptInfo,"连接错误!");
			theApp->SetSocket(Route,NULL);
			::PostMessage(theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(1),LPARAM(PromptInfo));
		}
		else
		{
//			theApp->SetSocketThread(Route,this);
//			AfxBeginThread(&thread,this);
				//theApp->IncreaseConnectedNum();
				//strcpy((char*)PromptInfo,"连接成功!");
				//::PostMessage(theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(1),LPARAM(PromptInfo));
				//::PostMessage(theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(3),LPARAM(theApp->GetConnectedNum()));
			closesocket(ServSock);
			ServSock = theApp->GetSocket(Route);
			::PostMessage(theApp->frameWnd,CREATENEWSOCKSERVER,WPARAM(0),LPARAM(0));

			tellen = 0;
			telnum[0] = 0;
			while((s!=SOCKET_ERROR)&&(s!=0)&&(tellen<4))
			{

				FD_SET(ServSock,&fdRead);
				FD_SET(ServSock,&fdWrite);
				ti = select(NULL,&fdRead,&fdWrite,NULL,&mWaitTime);
				if (FD_ISSET(ServSock,&fdRead)) CanRcvFlag = true;
				else CanRcvFlag = false;
				FD_ZERO(&fdRead);
				FD_ZERO(&fdWrite);

				if (CanRcvFlag)
				{
					s=recv(ServSock,buff,4,0);
					if ((s!=SOCKET_ERROR)&&(s>0))
					{
						if (s>4) s=4;
						if ((s+tellen) > 4) s = 4 - tellen;
						buff[s]=0;
						tellen += s;
						strcat(telnum,buff);
					}
				}
				Sleep(1);
			}

			if (tellen>=4)
			{
				theApp->IncreaseConnectedNum();
				strcpy((char*)PromptInfo,"连接成功!");
				::PostMessage(theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(1),LPARAM(PromptInfo));
				::PostMessage(theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(3),LPARAM(theApp->GetConnectedNum()));
				theApp->SetSocketTel(Route,telnum);
				RealView->AddListId(telnum);
			}
			else
			{
				if (s==SOCKET_ERROR)
					send(theApp->GetSocket(Route),"Disconnected++++++",100,0);
				shutdown(theApp->GetSocket(Route),2);
				closesocket(theApp->GetSocket(Route));
				theApp->SetSocket(Route,NULL);
//				theApp->DecreaseConnectedNum();
//				::PostMessage(theApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(3),LPARAM(theApp->GetConnectedNum()));
			}
		}
	}
	return CWinThread::Run();
}

void mSocket::CloseListenSocket()
{
	if (ServSock != NULL)
	{
		shutdown(ServSock,2);
		closesocket(ServSock);
		ServSock = NULL;
	}
}

/*			int tb=0,ti=123,tl=sizeof(int),tres;
			tres=getsockopt(ServSock,SOL_SOCKET,SO_REUSEADDR,(char*)&ti,&tl);
			tres=getsockopt(ServSock,SOL_SOCKET,SO_KEEPALIVE,(char*)&ti,&tl);
			tres=getsockopt(ServSock,SOL_SOCKET,SO_RCVBUF,(char*)&ti,&tl);
			tres=getsockopt(ServSock,SOL_SOCKET,SO_SNDBUF,(char*)&ti,&tl);
			tres=getsockopt(ServSock,SOL_SOCKET,SO_SNDTIMEO,(char*)&ti,&tl);
			tres=getsockopt(ServSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&ti,&tl);*/

⌨️ 快捷键说明

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