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

📄 tcpcliview.cpp

📁 Nucleus Plus源代码
💻 CPP
字号:
// TcpcliView.cpp : implementation file
//contains TCP server thread on WinSock

#include "stdafx.h"
#include "WinDemo.h"
#include "TcpcliView.h"
#include "TcpcliDoc.h"
#include "LoopByte.h"

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

static HWND m_hWindow;
static int nTCBytes, nTCPck;

#define Buflength 1460
int sockreadable;
HANDLE hStartEvent1 = NULL;
SOCKET tcps;
CLoopByte dlg2;
UINT TcpConnectClient(LPVOID pParam)
{
	int aRet;         /* accept       return error value */
	int rRet;         /* receive      return error value */
	int snRet;        /* send         return error value */
	int clRet;        /* close        return error value */
	int recsocket;                     /*value of receive socket */
	int wRet;          /* Select */
	char InBuf [Buflength];
	fd_set stReadFDS;                 /*fd set for the read */
	struct timeval stTimeOut;         /*timeout structure */
	int rmtaddrlen = sizeof(struct sockaddr);
	struct sockaddr    stRmtAddr3;     /*remote address structure */
	int lRet;         /* listen       return error value */
    unsigned long x = htonl(1);
	theApp.SendBytes((char *)&x, sizeof(unsigned long));
    unsigned long x1 = htonl(dlg2.m_eBytes);
	theApp.SendBytes((char *)&x1, sizeof(unsigned long));
	unsigned long x2 = htonl(dlg2.m_eLoops);
	theApp.SendBytes((char *)&x2, sizeof(unsigned long));

	/*code for listen() */
	lRet = listen(tcps, 2);            /*2 means queue up two connections */
	
	if (lRet == SOCKET_ERROR)          
		TRACE("listen call failed- error%d\n", WSAGetLastError());
	else
		TRACE("Made it to listen() call.\n");

	aRet = accept(tcps,                        
		(struct sockaddr FAR *)&stRmtAddr3,  
		&rmtaddrlen);

	if (aRet == SOCKET_ERROR)         
		TRACE("Unable to accept error - %d\n", WSAGetLastError());
	else
		TRACE ("Made it to accept() call.\n");      
	recsocket = aRet;
	sockreadable = 99;                   
	while (sockreadable == 99) 
	{
		/* clear all sockets from FDS structure, then put ours in */
		FD_ZERO(&stReadFDS);
		FD_SET(recsocket, &stReadFDS);
		
		/* initialize timeout value to xx seconds */
		
		stTimeOut.tv_sec   = 200;
		stTimeOut.tv_usec  = 0;
		
		wRet = select(-1,
			&stReadFDS, 
			NULL, 
			NULL, 
			&stTimeOut);
		
		
		if (wRet == SOCKET_ERROR)                 
			TRACE("Oh no, the select failed!!! Error - %d\n", WSAGetLastError());
		
		
		if (wRet != 0) 
			
		{              
			
			if (!(FD_ISSET (recsocket, &stReadFDS))) 
			{
				TRACE("Really big problem select returned positive value");
				TRACE(" and something should be set in read !!\n");
			}
					
			/*if the code has made it to this point, there is something to read*/
			
			rRet = recv(recsocket,                    
				(LPSTR)&InBuf,                
				Buflength,                    
				0);                           
			
			if (rRet == SOCKET_ERROR)         
				sockreadable = 5;
			
			if (rRet == 0)
				sockreadable = 5;
			
					
			
		}
		if (sockreadable == 99)
		{
			nTCBytes += rRet;
			InBuf[rRet] = 0;        /* Null Terminate InBuf. */
			
			snRet = send(recsocket, (LPSTR)&InBuf, rRet, 0);                       /* flags - no flags set    */
			
			if (snRet == SOCKET_ERROR)          
				TRACE("Unable to send- erro number %d\n", WSAGetLastError());
			nTCPck++;	
        DWORD dwResult;
		::SendMessageTimeout(m_hWindow, WM_UPDATE_PROGRESS, 0, 0, SMTO_BLOCK, 250, &dwResult);		
		}


	}      /* end of while loop */
	
	
	clRet = closesocket(recsocket);
	
	if (clRet != 0)                  
		TRACE("Problem closing socket Error -%d", WSAGetLastError());
	
	TRACE("Closing TCP server thread");
	SetEvent(hStartEvent1);
	return(0);
 }            /* end of program */


/////////////////////////////////////////////////////////////////////////////
// CTcpcliView

IMPLEMENT_DYNCREATE(CTcpcliView, CFormView)

CTcpcliView::CTcpcliView()
	: CFormView(CTcpcliView::IDD)
{
	//{{AFX_DATA_INIT(CTcpcliView)
	m_tcpcliByte = 0;
	m_tcpcliPck = 0;
	//}}AFX_DATA_INIT
}

CTcpcliView::~CTcpcliView()
{
}

void CTcpcliView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTcpcliView)
	DDX_Text(pDX, IDC_TCP_CLI_BYTE, m_tcpcliByte);
	DDV_MinMaxInt(pDX, m_tcpcliByte, 0, 2147483647);
	DDX_Text(pDX, IDC_TCP_CLI_PCK, m_tcpcliPck);
	DDV_MinMaxInt(pDX, m_tcpcliPck, 0, 2147483647);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTcpcliView, CFormView)
	//{{AFX_MSG_MAP(CTcpcliView)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_UPDATE_PROGRESS, OnUpdateProgress)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTcpcliView diagnostics

#ifdef _DEBUG
void CTcpcliView::AssertValid() const
{
	CFormView::AssertValid();
}

void CTcpcliView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTcpcliView message handlers


int CTcpcliView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFormView::OnCreate(lpCreateStruct) == -1)
		return -1;
	nTCBytes = 0;
	nTCPck = 0;
	dlg2.DoModal();
	m_hWindow = GetSafeHwnd();
	CWinThread* pThread1 = AfxBeginThread(TcpConnectClient, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
	hStartEvent1 = ::CreateEvent(NULL, FALSE, FALSE, NULL);
	return 0;
}

void CTcpcliView::OnDestroy() 
{
	CFormView::OnDestroy();
	sockreadable = 10; //close the WinSock TCP server thread 
	WaitForSingleObject(hStartEvent1, INFINITE);
	CloseHandle(hStartEvent1);
    unsigned long x = htonl(3);
	theApp.SendBytes((char *)&x, sizeof(unsigned long));

	
}


LRESULT CTcpcliView::OnUpdateProgress(WPARAM wParam, LPARAM lParam)
{
    m_tcpcliByte = nTCBytes;
	m_tcpcliPck = nTCPck;
	UpdateData(FALSE); //calls DDX
	return 0;
}

void CTcpcliView::OnClose() 
{
	CFormView::OnClose();
}

⌨️ 快捷键说明

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