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 + -
显示快捷键?