// FileTransDlg.cpp : implementation file
//
#include "stdafx.h"
#include "FileTrans.h"
#include "FileTransDlg.h"
#include <windows.h>
#include <algorithm>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const char* MULTICAST_IP = "224.0.0.99"; //多播组地址
const int MULTICAST_PORT = 2002; //多播组端口
const int BUFFER_SIZE = 1024;
static lock=1;
HANDLE hMutex;
static CString neighbourip;
static list<CString> iplist;
DWORD WINAPI SendIPInfo(LPVOID Lparam);
DWORD WINAPI ReceiveIPInfo(LPVOID Lparam);
BOOL joinBroadcastGroup()
{
WORD version=0x0002;
WSADATA WD;
int s=WSAStartup(version,&WD);
if (s!=0)
{
AfxMessageBox("WSAStarup Error");
}
SOCKET StoBrodacast;
StoBrodacast=socket(AF_INET,SOCK_DGRAM,0);
int ret ;
const int on = 1; //允许程序的多个实例运行在同一台机器上
ret = setsockopt(StoBrodacast, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
if( ret == SOCKET_ERROR )
{
WSACleanup();
AfxMessageBox("Error in setsockopt(SO_REUSEADDR): "+WSAGetLastError());
return 0;
}
const int routenum = 10;//设置多播的TTL
ret = setsockopt(StoBrodacast,IPPROTO_IP,IP_MULTICAST_TTL,(char*)&routenum,sizeof(routenum));
if( ret == SOCKET_ERROR )
{
WSACleanup();
AfxMessageBox("Error in setsockopt(IP_MULTICAST_TTL): "+WSAGetLastError());
return 0;
}
const int loopback =0; //禁止回馈
ret = setsockopt(StoBrodacast,IPPROTO_IP,IP_MULTICAST_LOOP,(char*)&loopback,sizeof(loopback));
if( ret == SOCKET_ERROR )
{
WSACleanup();
AfxMessageBox("Error in setsockopt(IP_MULTICAST_LOOP): "+WSAGetLastError());
return 0;
}
sockaddr_in broadAddr;
memset(&broadAddr,0,sizeof(broadAddr));
broadAddr.sin_family=AF_INET;
broadAddr.sin_port=htons(MULTICAST_PORT);
broadAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
ret=bind(StoBrodacast,(struct sockaddr*)&broadAddr,sizeof(broadAddr));
if (ret==SOCKET_ERROR)
{
WSACleanup();
AfxMessageBox("Bind_Error");
return 0;
}
ip_mreq mreq;
mreq.imr_multiaddr.S_un.S_addr=inet_addr(MULTICAST_IP);
mreq.imr_interface.S_un.S_addr=INADDR_ANY;
ret=setsockopt(StoBrodacast,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mreq,sizeof(mreq));
if (ret==SOCKET_ERROR)
{
WSACleanup();
AfxMessageBox("Error in setsockopt(IP_ADD_MEMBERSHIP)");
return 0;
}
DWORD DW1,DW2;
HANDLE BroadHandle[2];
/*--------------------------创建线程-------------------------------------*/
hMutex=CreateMutex(NULL,FALSE,NULL);//hMutex=CreateMutex(NULL,FALSE,NULL);
BroadHandle[0]=CreateThread(NULL,0,SendIPInfo,(LPVOID)StoBrodacast,0,&DW1);
BroadHandle[1]=CreateThread(NULL,0,ReceiveIPInfo,(LPVOID)StoBrodacast,0,&DW2);
WaitForMultipleObjects(2,BroadHandle,0,50);
WSACleanup();
return 0;
}
DWORD WINAPI SendIPInfo(LPVOID Lparam)
{
SOCKET broads=(SOCKET) Lparam;
sockaddr_in remote;
memset(&remote, 0, sizeof(remote));
remote.sin_addr.s_addr = inet_addr ( MULTICAST_IP );
remote.sin_family = AF_INET ;
remote.sin_port = htons(MULTICAST_PORT);
char *local_ip="219.245.126.254";
while (TRUE)
{
sendto(broads,local_ip,strlen(local_ip),0,(sockaddr*)&remote,sizeof(remote));
//AfxMessageBox("已经发送ip");
Sleep(5);
}
return 0;
}
DWORD WINAPI ReceiveIPInfo(LPVOID Lparam)
{
SOCKET broads=(SOCKET) Lparam;
char receive[BUFFER_SIZE+1];
int ret;
sockaddr_in neighbour;
int neighbourlen;
while(TRUE)
{
neighbourlen=sizeof(neighbour);
memset(&neighbour,0,neighbourlen);
//AfxMessageBox("接受进程");
ret=recvfrom(broads,receive,BUFFER_SIZE,0,(sockaddr*)(&neighbour),&neighbourlen);
if (ret==0) //do_read在用户直接回车发送了一个空字符串
{
continue;
}
else
if( ret == SOCKET_ERROR )
{
if( WSAGetLastError() == WSAEINTR ) //主线程终止recvfrom返回的错
break;
AfxMessageBox("Error in recvfrom: ");
}
else
{
receive[ret] ='\0';
neighbourip=receive;
list<CString>::iterator itor;
if((itor=find(iplist.begin(),iplist.end(),neighbourip))!=iplist.end())
iplist.push_back(neighbourip);
//GetDlgItem(IDC_IPONLINE)
//AfxMessageBox("hi"+*itor);
}
Sleep(4);
//Sleep(200);
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
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()
/////////////////////////////////////////////////////////////////////////////
// CFileTransDlg dialog
CFileTransDlg::CFileTransDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFileTransDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFileTransDlg)
// 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 CFileTransDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFileTransDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFileTransDlg, CDialog)
//{{AFX_MSG_MAP(CFileTransDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_COLLIP, OnCollip)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFileTransDlg message handlers
BOOL CFileTransDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 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
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CFileTransDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CFileTransDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CFileTransDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CFileTransDlg::OnCollip()
{
// TODO: Add your control notification handler code here
joinBroadcastGroup();
DWORD WINAPI ShowIP()
{
GetDlgItem(IDC_IPONLINE)->
}
}
我在FileTransDlg.cpp 中最前面定义了几个函数joinBroadcastGroup()DWORD WINAPI SendIPInfo(LPVOID Lparam);
DWORD WINAPI ReceiveIPInfo(LPVOID Lparam);。有一个控件List box,ID 是IDC_IPONLINE。我想在前面的函数中使用这个控件,不知道如何获得其指针,大侠们给看看。另外我非常困惑的就是mfc的组织机构,里面文件间的关系,以及程序是怎么运行的,顺序是怎么样的。如何在里面添加自定义的东西。