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

📄 servicedlg.cpp

📁 用MFC做的多人聊天程序
💻 CPP
字号:
// serviceDlg.cpp : implementation file
//

#include "stdafx.h"
#include "service.h"
#include "serviceDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// 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()

/////////////////////////////////////////////////////////////////////////////
// CServiceDlg dialog

CServiceDlg::CServiceDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CServiceDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CServiceDlg)
 
	count=0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
  UINT CServiceDlg::thread(LPVOID p)
{
	  
char buff[100];
CSize size;
size.cx=0;
size.cy=30;
int s=1,msgcount,loop=1,flag=0;
CServiceDlg *dlg=(CServiceDlg*)AfxGetApp()->GetMainWnd();
msgcount=dlg->getcount();
if(msgcount==-1)
loop=0;
if(loop)
{
s=1;
dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
if(dlg->msgsock[msgcount]==INVALID_SOCKET)

{
 dlg->m_edit.SetWindowText("Error accepet");
}
else
{
	AfxBeginThread(thread,0);
dlg->SetForegroundWindow();
 dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
dlg->m_list.InsertItem(  dlg->count++, "连接成功"   );

 dlg->m_list.Scroll(size);
dlg->m_button.EnableWindow(TRUE);
while(s!=SOCKET_ERROR)
{
s=recv(dlg->msgsock[msgcount],buff,100,0);
dlg->SetForegroundWindow();
if(s!=SOCKET_ERROR)
{
 dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr)  );
dlg->m_list.InsertItem(dlg->count++,buff);
dlg->m_list.Scroll(size);
dlg->sendtoall(dlg->msgsock[msgcount],buff);
 
}

}
send(dlg->msgsock[msgcount],"Disconnected",100,0);
dlg->m_list.InsertItem(dlg->count++,"Disconnected");
dlg->m_list.Scroll(size);
dlg->msgsock[msgcount]=NULL;
for(int i=0;i<50;i++)
if(dlg->msgsock[i]!=NULL)
flag=1;
 if(flag!=1)
 dlg->m_button.EnableWindow(FALSE);
closesocket(dlg->msgsock[msgcount]);

}}
AfxEndThread(0); 
return 0;
}
int CServiceDlg::getcount()
{
	for(int i=0;i<50;i++)
	{
		if(msgsock[i]==NULL)
			return i;
	}
	return -1;
}
BOOL CServiceDlg::OnInitDialog()
{ 

CDialog::OnInitDialog();
 ASSERT((IDM_ABOUTBOX& 0XFF0)== IDM_ABOUTBOX);
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);
}
}
SetIcon(m_hIcon,TRUE);
SetIcon(m_hIcon,FALSE);
count=0;
m_list.InsertColumn(0,"消息");
m_list.SetColumnWidth(0,435);
 m_edit.SetLimitText(99);
for(int i=0;i<50;i++)
msgsock[i]=NULL;
 serv.sin_addr.s_addr=htonl(INADDR_ANY);
 serv.sin_family=AF_INET;
 serv.sin_port=5000;
addlen=sizeof(serv);
m_button.EnableWindow(FALSE);
sock=socket(AF_INET,SOCK_STREAM,0);
if(bind(sock,(sockaddr*)&serv,addlen))
{
 m_edit.SetWindowText("绑定错误");

}
else
{
 m_edit.SetWindowText("服务器创建成功");
listen(sock,5);
 
   AfxBeginThread(   &thread  ,0  );

}
return true;
}

void CServiceDlg::sendtoall(SOCKET s,char *buff)
{
	for(int i=0;i<50;i++)
	{
  	if(msgsock[i]!=NULL&&msgsock[i]!=s)
			send(msgsock[i],buff,100,0);
	}
}
void CServiceDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CServiceDlg)
	DDX_Control(pDX, IDC_EDIT1 , m_edit );
	DDX_Control(pDX, IDSEND, m_button);
	DDX_Control(pDX, IDC_LIST2, m_list);
 
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CServiceDlg, CDialog)
	//{{AFX_MSG_MAP(CServiceDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDCANCEL3, OnCancel3)
	ON_BN_CLICKED(IDSEND, OnSend)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CServiceDlg message handlers
 

void CServiceDlg::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 CServiceDlg::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 CServiceDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CServiceDlg::OnCancel3() 
{
if (MessageBox("确定要退出吗?","提示",MB_YESNO|MB_DEFBUTTON2)==IDYES)
{
   ExitProcess(0);

}
	
}

void CServiceDlg::OnSend() 
{
char buff[100];
m_edit.GetWindowText(buff,99);
m_edit.SetWindowText("");
m_list.InsertItem(count++,buff);
CSize size;
size.cx=0;
size.cy=30;
m_list.Scroll(size);
for(int i=0;i<50;i++)
{
	if(msgsock[i]!=NULL)
		send(msgsock[i],buff,100,0);

}
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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