?? 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 + -