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

📄 udpcliview.cpp

📁 nucleus source 源码 全部源码
💻 CPP
字号:
// UdpcliView.cpp : implementation file
//contains UDP Server thread on WinSock

#include "stdafx.h"
#include "WinDemo.h"
#include "UdpcliView.h"
#include "LoopByte.h"
#define BufSize  1472
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

SOCKET udps;
static HWND m_hWindow4;
static int nUCBytes, nUCPck;
BOOL g_bCloseThread = FALSE;		// Signal the thread to terminat (TRUE)

HANDLE hStartEvent4 = NULL;
CLoopByte dlg3;


UINT UdpConnectClient(LPVOID pParam)
{
    
    char InBuf [BufSize];         /*input buffer */
    int rRet;                         /* receive returen error value*/
    int snRet;                        /* send return error value    */
    int n;                              /* Select value */
    struct sockaddr    rmtaddr;       /*remote addr structure */
    int structlen=sizeof(rmtaddr);    /*length of structure for calls  */
    int nBytesToXfer;                 /*bytes to transfer for send function*/
    FD_SET readfd;
    struct timeval timeout1;
    timeout1.tv_sec = 3;
    timeout1.tv_usec = 0;
    
    unsigned long x = htonl(2);
    theApp.SendBytes((char *)&x, sizeof(unsigned long));
    unsigned long x1 = htonl(dlg3.m_eBytes);
    theApp.SendBytes((char *)&x1, sizeof(unsigned long));
    unsigned long x2 = htonl(dlg3.m_eLoops);
    theApp.SendBytes((char *)&x2, sizeof(unsigned long));
    
    while(!g_bCloseThread)
    {
        memset(InBuf, 0, BufSize);
        
        FD_ZERO(&readfd);
        FD_SET(udps, &readfd);
        n = select(udps, &readfd, 0, 0, &timeout1); 
        if (n != SOCKET_ERROR && n != 0)
        {
            rRet = recvfrom(udps,                 /*the recfrom() stores the sockaddr */
                (LPSTR)&InBuf,          /*needed for the sendto()      */
                BufSize,                   /*size of buffer */
                0,                              /*flags */
                (struct sockaddr FAR *)&rmtaddr,     /*structure to put */
                &structlen);                          /*info into   */
            
        }
        else
        {
            TRACE("Unable to recvfrom- erro number %d\n", WSAGetLastError());
            break;
        }
        
        if ((rRet == 1) && (strcmp(InBuf, "q") == 0))
            break;
        
        nBytesToXfer = rRet;                  /*need length of InBuf*/
        
        
        snRet = sendto(udps,                      /*sends the string back */
            (LPSTR)&InBuf,
            nBytesToXfer,             /* how many bytes to send */
            0,                              /* flags  */
            (struct sockaddr FAR *)&rmtaddr,  /* structure stuff */
            sizeof(rmtaddr));
        
        if (snRet == SOCKET_ERROR)
        {
            TRACE("Unable to sendto- erro number %d\n", WSAGetLastError());
            break;
        }
        
        if (rRet != 0)  //update data on the window
        {
            nUCBytes += rRet;
            nUCPck++;
            DWORD dwResult;
            ::SendMessageTimeout(m_hWindow4, WM_UPDATE_UPROG4, 0, 0, SMTO_BLOCK, 250, &dwResult);
        }	
    }                       /*looping for right now */
    
    SetEvent(hStartEvent4);
    return 0;
}


/////////////////////////////////////////////////////////////////////////////
// CUdpcliView

IMPLEMENT_DYNCREATE(CUdpcliView, CFormView)

CUdpcliView::CUdpcliView()
	: CFormView(CUdpcliView::IDD)
{
	//{{AFX_DATA_INIT(CUdpcliView)
	m_udpcliByte = 0;
	m_udpcliPck = 0;
	//}}AFX_DATA_INIT
	g_bCloseThread = FALSE;
}

CUdpcliView::~CUdpcliView()
{
}

void CUdpcliView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CUdpcliView)
	DDX_Text(pDX, IDC_UDP_CLI_BYTE, m_udpcliByte);
	DDV_MinMaxInt(pDX, m_udpcliByte, 0, 2147483647);
	DDX_Text(pDX, IDC_UDP_CLI_PCK, m_udpcliPck);
	DDV_MinMaxInt(pDX, m_udpcliPck, 0, 2147483647);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CUdpcliView, CFormView)
	//{{AFX_MSG_MAP(CUdpcliView)
	ON_WM_CLOSE()
	ON_WM_CREATE()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_UPDATE_UPROG4, OnUpdateProgress4)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUdpcliView diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CUdpcliView message handlers


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

int CUdpcliView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFormView::OnCreate(lpCreateStruct) == -1)
		return -1;
	nUCBytes = 0;
	nUCPck = 0;
	dlg3.DoModal();
	m_hWindow4 = GetSafeHwnd();
	CWinThread* pThread4 = AfxBeginThread(UdpConnectClient, 
		THREAD_PRIORITY_NORMAL, 0, 0, NULL);
	hStartEvent4 = ::CreateEvent(NULL, FALSE, FALSE, NULL);
	
	return 0;
}

void CUdpcliView::OnDestroy() 
{
	g_bCloseThread = TRUE;	
    CFormView::OnDestroy();
	WaitForSingleObject(hStartEvent4, INFINITE);
	CloseHandle(hStartEvent4);	
    unsigned long x = htonl(4);
	theApp.SendBytes((char *)&x, sizeof(unsigned long));
}


LRESULT CUdpcliView::OnUpdateProgress4(WPARAM wParam, LPARAM lParam)
{
    m_udpcliByte = nUCBytes;
	m_udpcliPck = nUCPck;
	UpdateData(FALSE); //calls DDX
	return 0;
}

⌨️ 快捷键说明

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