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

📄 simplemessagerdlg.cpp

📁 NS2.15下关于无线传感器网络的spin协议仿真源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			CString text = "你的IP是 : " + hostip;
			m_hostip = hostip;
			AddNewMessage("本地", text);
			this->SetWindowText(text);
		}
	}

	//创建套接字
	m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if(m_socket<0)
	{
		int err = WSAGetLastError();
		CString text = "套接字创建失败!";
		CString errCode;
		errCode.Format(" ErrCode = %d", WSAGetLastError());

		AddNewMessage("本地", text + errCode);
		KillTimer(10000);
		m_SendButton.EnableWindow(FALSE);
	}
	else
	{
		AddNewMessage("本地", "套接字创建成功!");
	}

	//转换套接字为nonblocking 模式
	int mode = 1;
	result = ioctlsocket(m_socket, FIONBIO, (u_long FAR*)&mode);
	if(result)
	{
		int err = WSAGetLastError();
		CString text = "转换非阻塞模式失败!";
		CString errCode;
		errCode.Format(" ErrCode = %d", WSAGetLastError());

		AddNewMessage("本地", text + errCode);
		KillTimer(10000);
		m_SendButton.EnableWindow(FALSE);
	}
	else
	{
		AddNewMessage("本地", "转换阻塞模式成功!");
	}

	//绑定套接字
	memset(&m_fromAddr, 0, sizeof(m_fromAddr));
	m_fromAddr.sin_family = AF_INET;
	m_fromAddr.sin_addr.s_addr = htonl( INADDR_ANY );
	m_fromAddr.sin_port = htons( 12345 );
	if(bind(m_socket, (struct sockaddr*)&m_fromAddr, sizeof(m_fromAddr)) < 0)
	{
		int err = WSAGetLastError();
		CString text = "绑定套接字失败!";
		CString errCode;
		errCode.Format(" ErrCode = %d", WSAGetLastError());

		AddNewMessage("本地", text + errCode);
		KillTimer(10000);
		m_SendButton.EnableWindow(FALSE);
	}
	else
	{
		AddNewMessage("本地", "绑定套接字成功!");
	}

	AddNewMessage("本地", "准备接收消息!");

	m_NickNameText = m_hostip;

	if(!GetNickName())
	{
		AfxMessageBox("请先修改一个好的昵称!");
	}
	
	m_NickName.SetWindowText(m_NickNameText);

	BroadCastOnLine();

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CSimpleMessagerDlg::BroadCastOffLine()
{
	CString Msg ="OFFL ";
	Msg+=m_hostip;

	BroadCastMessageToNet(Msg);
}

void CSimpleMessagerDlg::BroadCastOnLine()
{
	CString Msg = "ONLI ";
	Msg+=m_hostip;
	Msg+=" ";
	CString tmp;
	m_NickName.GetWindowText(tmp);
	Msg+=tmp;

	BroadCastMessageToNet(Msg);
}

void CSimpleMessagerDlg::SendMessageToNet(const CString& ip, const CString& text)
{
	SOCKADDR_IN broadCastAddr;

	memset(&broadCastAddr, 0, sizeof(broadCastAddr));
	broadCastAddr.sin_family = AF_INET;
	broadCastAddr.sin_addr.s_addr = inet_addr(ip);
	broadCastAddr.sin_port = htons(12345);

	if(broadCastAddr.sin_addr.s_addr == 0 ||
		broadCastAddr.sin_addr.s_addr == INADDR_NONE)
	{
		return;
	}

	int sendlength = sendto(m_socket, text, strlen(text), 0,
		(struct sockaddr*)&broadCastAddr, sizeof(broadCastAddr));
	if(sendlength != strlen(text))
	{
		return;
	}
}

void CSimpleMessagerDlg::BroadCastMessageToNet(const CString& text)
{
	//广播局域网中所有主机
	for(int a = 0; a<255; a++)
	{
			CString targetIP;
			targetIP.Format("192.168.%d.255", a);

			SOCKADDR_IN broadCastAddr;

			memset(&broadCastAddr, 0, sizeof(broadCastAddr));
			broadCastAddr.sin_family = AF_INET;
			broadCastAddr.sin_addr.s_addr = inet_addr(targetIP);
			broadCastAddr.sin_port = htons(12345);

			if(broadCastAddr.sin_addr.s_addr == 0 ||
				broadCastAddr.sin_addr.s_addr == INADDR_NONE)
			{
				continue;
			}

			int sendlength = sendto(m_socket, text, strlen(text), 0,
				(struct sockaddr*)&broadCastAddr, sizeof(broadCastAddr));
			if(sendlength != strlen(text))
			{
				continue;
			}
	}
}

BOOL CSimpleMessagerDlg::PreTranslateMessage(MSG* pMsg)
{
	if(pMsg->message == WM_KEYDOWN)
	{ 
		if(pMsg->wParam == VK_RETURN)
		{
			if(m_IPEdit.GetFocus() != NULL)
			{
				return FALSE;
			}
		}

		if(pMsg->wParam == VK_ESCAPE)
		{
			return TRUE;
		}

	}

	return CDialog::PreTranslateMessage(pMsg);
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CSimpleMessagerDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		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;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CSimpleMessagerDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void CSimpleMessagerDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	OnOK();
}

void CSimpleMessagerDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码

	this->KillTimer(10000);
	this->KillTimer(10001);

	BroadCastOffLine();
	
	int result = closesocket(m_socket);
	if(result)
	{
		AddNewMessage("本地", "关闭套接字失败!");
	}
	else
	{
		AddNewMessage("本地", "成功关闭套接字!");
	}

	result = WSACleanup();
	if(result)
	{
		AddNewMessage("本地", "WINSOCK2.2 清理出错!");
	}
	else
	{
		AddNewMessage("本地", "WINSOCK2.2 清理成功!");
	}
	
	//AfxMessageBox("");
	OnCancel();
}

void CSimpleMessagerDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码

	CString sendIP;
	GetDlgItemText(IDC_EDIT4, sendIP);

	CString sendtext;
	GetDlgItemText(IDC_EDIT2, sendtext);
	
	//只取256字节长度
	if(sendtext.GetLength()>200)
	{
		AfxMessageBox("长度大于200,请修改后再发送!");
		
		return;
	}

	if(sendtext.GetLength() == 0)
	{
		AfxMessageBox("不准发空消息!");
		return;
	}

	char ipaddress[65536];
	strcpy(ipaddress, sendIP);
	char sendtexta[256];
	strcpy(sendtexta, sendtext);

	memset(&m_toAddr, 0, sizeof(m_toAddr));
	m_toAddr.sin_family = AF_INET;
	m_toAddr.sin_addr.s_addr = inet_addr(ipaddress);
	m_toAddr.sin_port = htons(12345);

	if(m_toAddr.sin_addr.s_addr == 0 ||
		m_toAddr.sin_addr.s_addr == INADDR_NONE)
	{
		AddNewMessage("本机", "消息发送失败!");
		return;
	}
	
	int sendlength = sendto(m_socket, sendtexta, strlen(sendtexta), 0,
						(struct sockaddr*)&m_toAddr, sizeof(m_toAddr));

	if(sendlength != strlen(sendtexta))
	{
		AddNewMessage("本机", "消息发送失败!");
		return;
	}

	AddNewMessage("本机", sendtext);

	m_SendMsgText.SetWindowText("");
	m_SendMsgText.SetFocus();
}

void CSimpleMessagerDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	m_ReciveMsgEdit.SetWindowText("");
}

void CSimpleMessagerDlg::BroadCastNewNickName()
{
	CString newNickName;
	m_NickName.GetWindowText(newNickName);

	CString command = "CHNN " + m_hostip + CString(" ") + newNickName;

	BroadCastMessageToNet(command);
}

void CSimpleMessagerDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	BroadCastNewNickName();

	GetDlgItemText(IDC_EDIT5, m_NickNameText);

	SaveNickName();
}

void CSimpleMessagerDlg::OnLbnSelchangeList1()
{
	// TODO: 在此添加控件通知处理程序代码
	int index = 0;
	index = m_UserList.GetCurSel();
	if(index == LB_ERR) return;

	CString nickname;
	m_UserList.GetText(index, nickname);

	//获得IP地址
	std::vector<UserStruct>::iterator it = m_UserTable.begin();
	for(;it!=m_UserTable.end();++it)
	{
		if((*it).nickname == nickname)
		{
			SetDlgItemText(IDC_EDIT4, (*it).hostip);
			break;
		}
	}

	UpdateData();

}

void CSimpleMessagerDlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码
	CString text;
	GetDlgItemText(IDC_EDIT2, text);

	//只取256字节长度
	if(text.GetLength()>200)
	{
		AfxMessageBox("长度大于200,请修改后再发送!");

		return;
	}

	if(text.GetLength() == 0)
	{
		AfxMessageBox("不准发空消息!");
		return;
	}
	
	std::vector<UserStruct>::iterator it = m_UserTable.begin();
	for(;it!=m_UserTable.end();++it)
	{
		SendMessageToNet((*it).hostip, text);
	}

	m_SendMsgText.SetWindowText("");
	m_SendMsgText.SetFocus();
}

void CSimpleMessagerDlg::OnBnClickedButton6()
{
	// TODO: 在此添加控件通知处理程序代码
	BroadCastOnLine();
}

⌨️ 快捷键说明

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