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