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

📄 irsenddlg.cpp

📁 红外线
💻 CPP
字号:
// IrSendDlg.cpp : implementation file
//

#include "stdafx.h"
#include "IrSend.h"
#include "IrSendDlg.h"
#include <af_irda.h>
#include <winsock.h>
//自定义消息
#define WM_GETSTRING          (WM_USER + 100)	
//全局变量与全局函数的声明
SOCKET s_Socket; //服务器端Socket.
SOCKET c_Socket; //客户端Socket
//IrDA地址
SOCKADDR_IRDA	address = {AF_IRDA, 0, 0, 0, 0, "IrSend"};
HWND g_hWnd = NULL;
CEdit* g_pEditReceive = NULL;
TCHAR c[100];
typedef struct _PACKET //接收发送数据包结构	
{
    DWORD       dLength;  //接收发送数据长度
    CHAR        cString[500];//接收数据
} PACKET;
void IrSend(int len, BYTE *Buffer);//发送数据的客户端线程函数
DWORD IrThread( LPVOID pParam ); //IR服务器端线程函数

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

/////////////////////////////////////////////////////////////////////////////
// CIrSendDlg dialog

CIrSendDlg::CIrSendDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CIrSendDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CIrSendDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CIrSendDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CIrSendDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CIrSendDlg, CDialog)
	ON_MESSAGE(WM_GETSTRING, OnGetString)
	//{{AFX_MSG_MAP(CIrSendDlg)
	ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIrSendDlg message handlers
//自定义消息的响应函数,把取得的字符串显示出来。
LRESULT CIrSendDlg::OnGetString(WPARAM wParam, LPARAM lParam)
{
	wsprintf(c,TEXT("%s"),(TCHAR *)wParam);
	g_pEditReceive->SetWindowText(c);
	return 0;
}

BOOL CIrSendDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	CenterWindow(GetDesktopWindow());	// center to the hpc screen
	//初始化全局变量
	g_hWnd=m_hWnd;
	g_pEditReceive=(CEdit*)GetDlgItem(IDC_EDIT_RECEIVE);
	DWORD Id = 0L; 
	HANDLE	    	pThread;			 // thread handle
	//创建IR服务器线程
	pThread = CreateThread( NULL, 0, IrThread,m_hWnd, 0L, &Id);	
	CloseHandle(pThread);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

//执行"发送"按钮
void CIrSendDlg::OnButtonSend() 
{
TCHAR c[200];
CString s;
CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT_SEND);
pEdit->GetWindowText(s);
wsprintf(c,_T("%s"),s);
//调用发送数据线程函数
IrSend((wcslen(c)+1)*sizeof(WCHAR),(BYTE *)c);
}

 //IR服务器线程,初始化时被创建
DWORD IrThread( LPVOID pParam )
{
	PACKET		Packet;
	BYTE		   	*rBuf;
	BYTE		    *tBuffer=NULL;
	s_Socket = socket(AF_IRDA, SOCK_STREAM, 0);
	bind(s_Socket, (struct sockaddr *)&address, sizeof(address));
	listen(s_Socket, 1);
	int	flag=TRUE;
	while (flag==TRUE)
		{
		//等待客户端与我们联系
		c_Socket = accept(s_Socket, 0, 0);
		if (c_Socket ==SOCKET_ERROR) flag=FALSE;
		// 从客户端接收字符串
		rBuf=(BYTE *)&Packet;
		recv(c_Socket, (char *)rBuf, sizeof(Packet), 0);
		if (c_Socket ==INVALID_SOCKET)
			flag=FALSE;
		if (Packet.dLength>0)
			{
			tBuffer = (BYTE *)LocalAlloc(LMEM_ZEROINIT, 
  										     Packet.dLength);
			memcpy(tBuffer,Packet.cString, Packet.dLength);
			}
		//调用自定义消息的响应函数,把取得的字符串显示出来。
		SendMessage((HWND)pParam,WM_GETSTRING,
							 (WPARAM)tBuffer,(LPARAM)Packet.dLength);
		closesocket(c_Socket); //关闭客户端的Socket
		}
	return(TRUE);
}
//发送数据的客户端线程函数,按"发送"按钮时它被调用
void IrSend(int len, BYTE *Buffer)
{
	DEVICELIST			dLst;    
	int		dLstLen = sizeof(dLst),num = 0,i=0;
	c_Socket = socket(AF_IRDA, SOCK_STREAM, 0);
	dLst.numDevice = 0;    
	PACKET 		Packet;
	//试6次,以便找到服务器端SOCKET 
	while ((dLst.numDevice == 0) && (num <= 6))    
		{
		getsockopt(c_Socket, SOL_IRLMP, IRLMP_ENUMDEVICES,
                   (char *)&dLst, &dLstLen);        
  		if (dLst.numDevice!=0) break;
		num++;
		Sleep(600);
		}
	if  (num > 6)
		return ;
    else //找到服务器端SOCKET
		{
		for (i = 0; i <= 3; i++)             
			address.irdaDeviceID[i]=dLst.Device[0].irdaDeviceID[i];
		//连结服务器端SOCKET
		connect(c_Socket , (struct sockaddr *)&address,
			sizeof(SOCKADDR_IRDA));
		memset(Packet.cString,0,sizeof(Packet.cString));
		Packet.dLength = len;
		memcpy( Packet.cString, Buffer, len);
		//发送数据
		send(c_Socket,(CHAR FAR *)&Packet,len+sizeof(DWORD), 0 );
		closesocket(c_Socket);    
   		}
   return ;
}

⌨️ 快捷键说明

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