基于UDP的MFC聊天程序设计

利用MFC创建基于UDP的聊天通信工具很简单,程序是基于MFC的对话框实现的。程序界面如下面所示:

1 概述

要添加的内容主要主要是发送端和接受端程序,以及最开始对话框程序初始化的时候对套接字的初始化。以及自定义消息WM_RECVDATA

2 接受线程

其次要注意的是因为接受函数recvfrom是一个阻塞函数,所以要开辟一个线程来专门接受消息。并且要把socket以及窗口句柄hwnd传递给线程的启动函数。

主要代码如下所示:

BOOLCmfcChatDlg::OnInitDialog()
{
         //…..省略以上代码
         // TODO: 在此添加额外的初始化代码
         ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1) )->SetAddress(127,0,0,1);
         InitSocket();

         RECVPARAM *pRecvParam = new RECVPARAM;
         pRecvParam->socket = m_socket;
         pRecvParam->hwnd = m_hWnd;
         HANDLE hThread =CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
         returnTRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 创建并且初始化套接字
BOOLCmfcChatDlg::InitSocket(void)
{
         m_socket =socket(AF_INET,SOCK_DGRAM,0);
         if(INVALID_SOCKET == m_socket)
         {
                   MessageBox(TEXT("socket create failed"));
                   returnFALSE;
         }

         sockaddr_in addrSock;
         addrSock.sin_family = AF_INET;
         addrSock.sin_port = htons(6000);
         addrSock.sin_addr.S_un.S_addr =htonl(INADDR_ANY);

         intretVal;
         retVal =bind(m_socket,(sockaddr*)&addrSock,sizeof(addrSock));
         if(SOCKET_ERROR == retVal)
         {
                   closesocket(m_socket);
                   MessageBox(TEXT("Faild bind socket"));
                   returnFALSE;
         }

         returnTRUE;
}

DWORDCmfcChatDlg::RecvProc(LPVOID lpParameter)
{
         SOCKET socket =((RECVPARAM*)lpParameter)->socket;
         HWND hwnd =((RECVPARAM*)lpParameter)->hwnd;
         deletelpParameter;
         lpParameter = NULL;

         sockaddr_in addrFrom;
         int len= sizeof(addrFrom);

         charrecvBuf[200];
         chartempBuf[300];
         intretVal;
         while(TRUE)
         {
                   retVal =recvfrom(socket,recvBuf,200,0,(sockaddr*)&addrFrom,&len);
                   if(retVal == SOCKET_ERROR)
                   {
                            break;
                   }
                   sprintf(tempBuf,TEXT("%s say: %s"),inet_ntoa(addrFrom.sin_addr),recvBuf);
                   ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
         }
         return0;
}

afx_msg LRESULTCmfcChatDlg::OnRecvdata(WPARAM wParam, LPARAM lParam)
{
         CString str = (char*)lParam;
         CString strTemp;

         GetDlgItemText(IDC_EDIT_RECV,strTemp);
         str += "\r\n";
         strTemp += str;
         SetDlgItemText(IDC_EDIT_RECV,strTemp);

         return0;
}

void CmfcChatDlg::OnBnClickedBtnSend()
{
         // TODO: 在此添加控件通知处理程序代码
         DWORD dwIP;
         ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1) )->GetAddress(dwIP);

         sockaddr_in addrTo;
         addrTo.sin_family = AF_INET;
         addrTo.sin_port = htons(6000);
         addrTo.sin_addr.S_un.S_addr =htonl(dwIP);

         CString strSend;
         CString strTemp;
         GetDlgItemText(IDC_EDIT_SEND,strSend);

         GetDlgItemText(IDC_EDIT_RECV,strTemp);
         strTemp = strTemp + TEXT("you say :") + strSend + "\r\n";
         SetDlgItemText(IDC_EDIT_RECV,strTemp);

         CString strIP =inet_ntoa(addrTo.sin_addr);
         if(strIP != CString("127.0.0.1"))
         {
                   sendto(m_socket,strSend,strlen(strSend)+1,0,(sockaddr*)&addrTo,sizeof(sockaddr));
         }

         SetDlgItemText(IDC_EDIT_SEND,TEXT("") );

}

3 自定义消息添加

在MFC类向导中,消息,添加自定义消息,打开了对话然后添加自定义消息然后在头文件中为自定义消息指定一个值,这个用宏定义来实现,如:define  WM_XXX  WM_USER+1

4 防火墙

如果程序要跟外网上的交流沟通,那么首先要知道外网的IP,其次就是要注意防火墙,可以把防火墙关闭,从而使其不阻挡消息的收发。

时间: 2024-10-18 02:48:08

基于UDP的MFC聊天程序设计的相关文章

第二十五、二十六天:基于UDP的网路聊天程序

连续四天学习套接字的编程,可见套接字的重要性了.基于TCP和UDP分别写了两个程序.一是利用TCP实现一个服务器对多个客户端,客户端你发送信息,服务器就从事先准备好的五个字符串中随机回复一条.另一个是利用UDP实现两个人的对话,对话时可以是多个信息同时输入. 先是第一个程序.要实现一对多,就要使用线程编程,服务器端在不断监听中,如果有连接请求的话,就用通过accept函数接受并创建一个线程来处理.线程的创建函数为int pthread_create(pthread_t * thread, pth

15.基于UDP协议的聊天室程序

使用UDP协议完成一个聊天室程序的小项目,大部分代码都有注释,一看就能看到的. 实现的功能:               (1)查看/显示已经登陆的用户信息               (2)向已登陆的用户发送消息               (3)输出错误消息,给予提示               (4)退出 共有三个文件: chat_public.h #ifndef _CHAT_PUB_H_ #define _CHAT_PUB_H_ //chat_public.h #include <lis

基于udp的局域网聊天室

需要实现功能如下: 1.服务器端功能如下: 广播通知客服端登录/退出 接受客服端发来的消息,广播给所有用户 广播系统消息 2.客服端功能如下: 接收服务器发来的消息并显示 发送消息给服务器端 实现代码如下: //***********服务端******************* 1 #include <head.h> 2 3 #define CLIENT_LOGIN 10 4 #define CLIENT_QUIT 20 5 #define CLIENT_TALK 30 6 #define S

基于UDP协议的聊天室(java实现)

主要思路很简单: 1.设置自己的接收端口 2.设置对方IP和端口 3.发送数据和接收数据 下面是主要代码: import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; public class QQFrame extends JFrame implements Runnable { private JTextArea sendArea = new JT

C++开发的基于UDP协议的聊天工具

项目相关地址 源码:https://github.com/easonjim/UDPChat bug提交:https://github.com/easonjim/UDPChat/issues

【Java网络编程】基于UDP的聊天通信

使用udp协议,写一个基于命令行的聊天软件:客户端跟服务端分别在命令行启动之后,客户端和服务器端可以互相发送数据. 一.创建线程 sendThread 和receiveThread 1 package com.fhcq.chat; 2 3 //双工的聊天程序 4 //可以发送数据,同时也可以等待接收数据 5 //需要使用多线程来实现 6 7 public class QICQDemo { 8 9 public static void main(String[] args) { 10 // TOD

Java网络编程 - 基于UDP协议 实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理. "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: 将客户端的信息(进入了哪一个聊

Linux网络编程:基于UDP的程序开发回顾篇

基于无连接的UDP程序设计 同样,在开发基于UDP的应用程序时,其主要流程如下: 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多.对比面向连接的TCP程序,服务端少了listen和accept函数.前面我们也说过listen函数最主要的作用就是将一个socket套接字描述符转为被动监听模式,然后调用accept主要是用于等待客户端(用connect)来连接服务器.connect函数不仅可以用于流式套接字还可用于数据报式套接字.在TCP中,客户端调用connect函数

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还