📄 tcpcliview.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 + -