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

📄 bstvdlg.cpp

📁 采用vc++实现了模拟广播网发送UCL标引的数据包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// BSTVDlg.cpp : implementation file
//

#include "stdafx.h"
#include "BSTV.h"
#include "BSTVDlg.h"
#include "UCLDlg.h"
#include "winsock.h"

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

extern CBSTVApp theApp;       // 5 在此引用应用类中的theApp来获取库连接指针
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
BOOL bStop;//定义bStop为false
BOOL bStop2;
BOOL bStop3;//定义bStop为false
BOOL bStop4;
CString FileName[100];
CString strType[100];
CString strName[100];//节目名
CString strNameB;//文件名
CString FileName2[100];
CString strType2[100];
CString strName2[100];//节目名
CString strName2B;//文件名
int nFileCount;
int nFileCount2;
long j=0,k;
long j2=0,k2;
//定义、初始化要发送文件的“总包数”:
long m_PacketTotalNum=0;
long m_PacketTotalNum2=0;
//定义、初始化“当前传送包”:
long m_PacketSerialNum=0;
long m_PacketSerialNum2=0;
//定义一个指向源文件的指针:
FILE *m_pSourceFile=NULL;
FILE *m_pSourceFile2=NULL;
//定义一个字符串变量,用来暂存“欲发送文件的路径名”:
//CString MidString="";
char buffer[L+100]={""};
char buffer2[L+100]={""};
//定义一个指向发送套接字的指针:
CSocket *m_pSendSocket=NULL;
CSocket *m_pSendSocket2=NULL;
int	m_Recv_Port=7001;
int	m_Recv_Port2=7002;

UINT SourceFile(LPVOID param)
{
	m_pSendSocket=new CSocket();
	if(!m_pSendSocket->Create(8001,SOCK_DGRAM))  
	{
		AfxMessageBox("创建套接字失败");
	}  	
	long i;//定义一个长整型变量,读取源文件中的数据时将要用到
    _variant_t var;
    while(!bStop2)//不按“停止”就一直执行
	{
     for(int FileSendNum=0;(FileSendNum<nFileCount)&&(!bStop2);FileSendNum++)
	 {	
        try
		{
          // try to open the file
         CFile sysFile(_T(FileName[FileSendNum]), CFile::modeRead);        
         strNameB=(LPCTSTR) sysFile.GetFileName();
           // close the file handle
         sysFile.Close();
		 sprintf(buffer+L+60,"%s",strNameB);//把文件名放到发送数据包中
		 sprintf(buffer+L+20,"%s",strName[FileSendNum]);//把文件名放到发送数据包中
		 sprintf(buffer+L+12,"%s",strType[FileSendNum]);
		}
        catch (CFileException* pEx)
		{
          // if an error occurs, just make a message box
          pEx->ReportError();
          pEx->Delete();
		}

		if((m_pSourceFile=fopen(FileName[FileSendNum],"rb"))==NULL)
		{
          AfxMessageBox("打开文件失败!");
		}

        bStop=0;
		WIN32_FIND_DATA  FindFileData;
	    FindClose(FindFirstFile(FileName[FileSendNum],&FindFileData));

    	k=FindFileData.nFileSizeLow;
	    m_PacketTotalNum=k/L+1;//刚改过来
	    memcpy(buffer+L+4,&m_PacketTotalNum,4);//发送总的文件包数
		m_PacketSerialNum=0;
		//开始发送文件
		   while(!bStop&&!bStop2)
		   {
			::PostMessage((HWND)param,WM_SENDSERIAL,0,0);//显示"当前传送包"
		     
		    for(i=0;i<L && !feof(m_pSourceFile);i++)			
		    buffer[i]=fgetc(m_pSourceFile);

	        memcpy(buffer+L,&i,4);//数据包大小写到缓冲区
	        memcpy(buffer+L+8,&m_PacketSerialNum,4);//当前发送数据包
		    m_PacketSerialNum++;
		    if(feof(m_pSourceFile))//如果检测到文件已经结束(已经发送完)
			{
	    	   i--;//i(实际收到的字节数)自减,		       
			   memcpy(buffer+L,&i,4);
		      //	rewind(m_pSourceFile);//文件指针回到开头
			  bStop=1;
			  if(m_pSourceFile)//如果源文件还处于打开状态
			  fclose(m_pSourceFile);//关闭源文件 
			  m_PacketSerialNum=0;//将“当前传送包(m_PacketSerialNum)”的值复0,重新计数
			  
			  m_pSendSocket->SendTo(buffer,L+100,m_Recv_Port,"127.0.0.1",0);//刚加的	                             	
		      ::Sleep(50);
		      continue;				  
			}        
		
	    	m_pSendSocket->SendTo(buffer,L+100,m_Recv_Port,"127.0.0.1",0);	                             	
		    ::Sleep(50);
		   }//发送文件结束
		
	       if(bStop&&(FileSendNum==nFileCount))//所有文件都发送完毕
		   {              
			  if(m_pSourceFile)//如果源文件还处于打开状态
				fclose(m_pSourceFile);//关闭源文件	   
		      return 0;//函数返回0值
		   }		
	 }//for循环
	
	    if(bStop2)
		{
		  if(m_pSendSocket)//如果发送套接字m_pSendSocket还有效
			delete m_pSendSocket;//删除发送套接字m_pSendSocket
		  m_pSendSocket=NULL;//复原
		  if(m_pSourceFile)//如果源文件还处于打开状态
			fclose(m_pSourceFile);//关闭源文件	   
		  return 0;//函数返回0值
		}
	}//while循环
}

UINT SourceFile2(LPVOID param)
{
	m_pSendSocket2=new CSocket();
	if(!m_pSendSocket2->Create(8002,SOCK_DGRAM))  
	{
		AfxMessageBox("创建套接字失败");
	}  	
	long i2;//定义一个长整型变量,读取源文件中的数据时将要用到
    _variant_t var;
    while(!bStop4)//不按“停止”就一直执行
	{
     for(int FileSendNum2=0;(FileSendNum2<nFileCount2)&&(!bStop4);FileSendNum2++)
	 {	
        try
		{
          // try to open the file
         CFile sysFile2(_T(FileName2[FileSendNum2]), CFile::modeRead);        
         strName2B=(LPCTSTR) sysFile2.GetFileName();
           // close the file handle
         sysFile2.Close();
		 sprintf(buffer2+L+60,"%s",strName2B);//把文件名放到发送数据包中
		 sprintf(buffer2+L+20,"%s",strName2[FileSendNum2]);//把文件名放到发送数据包中
		 sprintf(buffer2+L+12,"%s",strType2[FileSendNum2]);
		}
        catch (CFileException* pEx)
		{
          // if an error occurs, just make a message box
          pEx->ReportError();
          pEx->Delete();
		}

		if((m_pSourceFile2=fopen(FileName2[FileSendNum2],"rb"))==NULL)
		{
          AfxMessageBox("打开文件失败!");
		}

        bStop3=0;
		WIN32_FIND_DATA  FindFileData2;
	    FindClose(FindFirstFile(FileName2[FileSendNum2],&FindFileData2));

    	k2=FindFileData2.nFileSizeLow;
	    m_PacketTotalNum2=k2/L+1;//刚改过来
	    memcpy(buffer2+L+4,&m_PacketTotalNum2,4);//发送总的文件包数
		m_PacketSerialNum2=0;
		//开始发送文件
		   while(!bStop3&&!bStop4)
		   {
			::PostMessage((HWND)param,WM_SENDSERIAL2,0,0);//显示"当前传送包"
		     
		    for(i2=0;i2<L && !feof(m_pSourceFile2);i2++)			
				buffer2[i2]=fgetc(m_pSourceFile2);

	        memcpy(buffer2+L,&i2,4);//数据包大小写到缓冲区
	        memcpy(buffer2+L+8,&m_PacketSerialNum2,4);//当前发送数据包
		    m_PacketSerialNum2++;
		    if(feof(m_pSourceFile2))//如果检测到文件已经结束(已经发送完)
			{
	    	   i2--;//i(实际收到的字节数)自减,		       
			   memcpy(buffer2+L,&i2,4);
		      //	rewind(m_pSourceFile);//文件指针回到开头
			  bStop3=1;
			  if(m_pSourceFile2)//如果源文件还处于打开状态
				fclose(m_pSourceFile2);//关闭源文件 
			  m_PacketSerialNum2=0;//将“当前传送包(m_PacketSerialNum)”的值复0,重新计数
			  
			  m_pSendSocket2->SendTo(buffer2,L+100,m_Recv_Port2,"127.0.0.1",0);//刚加的	                             	
		      ::Sleep(50);
		      continue;				  
			}        
		
	    	m_pSendSocket2->SendTo(buffer2,L+100,m_Recv_Port2,"127.0.0.1",0);	                             	
		    ::Sleep(50);
		   }//发送文件结束
		
	       if(bStop3&&(FileSendNum2==nFileCount2))//所有文件都发送完毕
		   {              
			   if(m_pSourceFile2)//如果源文件还处于打开状态
					fclose(m_pSourceFile2);//关闭源文件	   
		      return 0;//函数返回0值
		   }		
	 }//for循环
	
	    if(bStop4)
		{
		  if(m_pSendSocket2)//如果发送套接字m_pSendSocket还有效
          delete m_pSendSocket2;//删除发送套接字m_pSendSocket
          m_pSendSocket2=NULL;//复原
		  if(m_pSourceFile2)//如果源文件还处于打开状态
          fclose(m_pSourceFile2);//关闭源文件	   
		  return 0;//函数返回0值
		}
	}//while循环
}

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBSTVDlg dialog

CBSTVDlg::CBSTVDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CBSTVDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CBSTVDlg)
	m_ctsFileaddr = _T("节目等待发送第一路");
	m_ctsFileaddr2 = _T("节目等待发送第二路");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CBSTVDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBSTVDlg)
	DDX_Control(pDX, IDC_LISTSEND2, m_AccessListSend2);
	DDX_Control(pDX, IDC_ReceivePort1, m_ReceivePort1);
	DDX_Control(pDX, IDC_ReceivePort2, m_ReceivePort2);
	DDX_Control(pDX, IDC_SEND, m_ctlBsend);
	DDX_Control(pDX, IDC_LISTSEND, m_AccessListSend);
	DDX_Control(pDX, IDC_LISTACCESS, m_AccessList);
	DDX_Text(pDX, IDC_PROCESS, m_ctsFileaddr);
	DDX_Text(pDX, IDC_PROCESS2, m_ctsFileaddr2);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CBSTVDlg, CDialog)
	//{{AFX_MSG_MAP(CBSTVDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_READACCESS, OnReadaccess)
	ON_BN_CLICKED(IDC_WRITEACCESS, OnWriteaccess)
	ON_BN_CLICKED(IDC_MODIFY, OnModify)
	ON_BN_CLICKED(IDC_DELETE, OnDelete)
	ON_LBN_SELCHANGE(IDC_LISTACCESS, OnSelchangeListaccess)
	ON_BN_CLICKED(IDC_SEND, OnSend)
	ON_LBN_SELCHANGE(IDC_LISTSEND, OnSelchangeListsend)
	ON_BN_CLICKED(IDC_SENDADD, OnSendadd)
	ON_BN_CLICKED(IDC_SENDDELET, OnSenddelet)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	ON_BN_CLICKED(IDC_ReceivePort1, OnReceivePort1)
	ON_BN_CLICKED(IDC_ReceivePort2, OnReceivePort2)
	ON_BN_CLICKED(IDC_SENDADD2, OnSendadd2)
	ON_LBN_SELCHANGE(IDC_LISTSEND2, OnSelchangeListsend2)
	ON_BN_CLICKED(IDC_SENDDELET2, OnSenddelet2)
	ON_BN_CLICKED(IDC_SEND2, OnSend2)
	ON_MESSAGE(WM_SENDSERIAL,OnSendSerial)//---------------------------------模拟一个按钮
	ON_MESSAGE(WM_SENDSERIAL2,OnSendSerial2)
	ON_BN_CLICKED(IDC_STOP2, OnStop2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBSTVDlg message handlers
//////////////////////////////////////////////////////////////////////////////
//名称:OnInitDialog
//功能:初始化对话框
/////////////////////////////////////////////////////////////////////////////

BOOL CBSTVDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// Add "About..." menu item to system menu.

⌨️ 快捷键说明

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