VC6.0创建基于UDP协议的网络聊天程序

只有一个工程UDP,服务器和客户端都是这个工程,因为UDP中C/S区分不强化



只讲关键部分,避免累赘
1.为对话框添加控件

2.为控件绑定变量和消息函数

启动按钮消息函数为Onstart()

发送按钮为OnSendInfo()

3.写一个线程函数用于接收消息(不是成员函数,注意!,在CUDPDlg.cpp文件中定义)如下:

UINT ThreadProcRecv(LPVOID pParam)
{
    CUDPDlg * dlg=(CUDPDlg*)pParam;
 WORD wVertionRequested;
 WSADATA wsadata;
 int err;
 wVertionRequested = MAKEWORD(2,2);
 err=WSAStartup(wVertionRequested,&wsadata);
 if(err!=0)
 {
  dlg->MessageBox("加载版本2.2失败!");
  return 0;
 }
 if(LOBYTE(wsadata.wVersion)!=2||HIBYTE(wsadata.wHighVersion)!=2)
 {
  dlg->MessageBox("加载版本不是套接字2.2版本!");
  WSACleanup();
  return 0;
 }
 SOCKET socketServer=socket(AF_INET,SOCK_DGRAM,0);
 SOCKADDR_IN addr;
 addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addr.sin_family=AF_INET;
 addr.sin_port=htons(dlg->m_recvport);
 bind(socketServer,(SOCKADDR *)&addr,sizeof(SOCKADDR));
 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);
 char buffer[100];
 while(TRUE)
 {
  recvfrom(socketServer,buffer,100,0,(SOCKADDR *)&addrClient,&len);
  CString info;
  info.Format("%s%s","他说:",buffer);
  dlg->m_listbox.AddString(info);
  dlg->SetHScroll();
 
     dlg->GetDlgItem(IDC_LIST1)->PostMessage(WM_VSCROLL,SB_BOTTOM,0);
 }
 closesocket(socketServer);
 WSACleanup();
 return 0;
}
4.编写消息函数
 
void CUDPDlg::OnStart()
{
 UpdateData(TRUE);
 GetDlgItem(IDC_EDIT4)->EnableWindow(FALSE);
 GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
 GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
 GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
    
 if(AfxBeginThread(ThreadProcRecv,this))
  MessageBox("启动成功!");
}
 
void CUDPDlg::OnSendInfo()
{
 GetDlgItem(IDC_EDIT3)->SetFocus();
 UpdateData(TRUE);
 if(m_sendinfo.IsEmpty())
 {
  MessageBox("消息为空");
  return;
 }
 WORD wVertionRequested;
 WSADATA wsadata;
 int err;
 wVertionRequested = MAKEWORD(2,2);
 err=WSAStartup(wVertionRequested,&wsadata);
 if(err!=0)
 {
  MessageBox("加载套接字2.2版本失败!");
  return;
 }
 if(LOBYTE(wsadata.wVersion)!=2||HIBYTE(wsadata.wHighVersion)!=2)
 {
  MessageBox("加载版本不是套接字2.2版本!");
  WSACleanup();
  return;
 }
 SOCKET socketServer=socket(AF_INET,SOCK_DGRAM,0);
 SOCKADDR_IN addr;
 addr.sin_addr.S_un.S_addr=inet_addr(m_ip.GetBuffer(0));
 addr.sin_family=AF_INET;
 addr.sin_port=htons(m_sendport);
 char * send;
 send=m_sendinfo.GetBuffer(m_sendinfo.GetLength());
 CString text;
 text.Format("%s%s","我说:",send);
 m_listbox.AddString(text);
 SetHScroll();
 sendto(socketServer,send,m_sendinfo.GetLength()+1,0,(SOCKADDR *)&addr,sizeof(SOCKADDR));
 closesocket(socketServer);
 WSACleanup();
 m_sendinfo="";
 UpdateData(FALSE);
 GetDlgItem(IDC_LIST1)->PostMessage(WM_VSCROLL,SB_BOTTOM,0);
}
5.至此已基本完成,运行实例:
1.打开一个客户端(端口号相同)
2.打开一个客户端(端口号不同)

3.打开2个客户端(一台机子)

遗漏点补充:

1.为了方便,可以勾选发送按钮属性框中的默认按钮选项,可以通过enter发送消息

2.列表框控件无法设置水平滚动条,必须自己添加函数

添加函数前先把列表框属性水平滚动条勾选上
然后添加下面成员函数
void CUDPDlg::SetHScroll()
{
    CDC* dc = GetDC();
    SIZE s;
    int index;
    CString str;
    long temp;
    for(index= 0; index< m_listbox.GetCount(); index++)
    {
        m_listbox.GetText(index,str);
        s = dc->GetTextExtent(str,str.GetLength()+1);   // 获取字符串的像素大小
        // 如果新的字符串宽度大于先前的水平滚动条宽度,则重新设置滚动条宽度
        // IDC_LISTBOX为m_List的资源ID
        temp = (long)SendDlgItemMessage(IDC_LIST1, LB_GETHORIZONTALEXTENT, 0, 0); //temp得到滚动条的宽度
        if (s.cx > temp) 
        {
            SendDlgItemMessage(IDC_LIST1, LB_SETHORIZONTALEXTENT, (WPARAM)s.cx, 0);
        }
    }
    ReleaseDC(dc);
}
以后每当使用向列表框添加语句时,在后面调用该函数即可
3.UpdateData(TRUE)和UpdateData(FALSE)非常重要,不可缺少,不懂请百度
基本就这样了,希望对你们有所帮助!
工程文件百度网盘下载:https://pan.baidu.com/s/1d1SlR3gJzZA4XEGJmquJLw 提取码:nu77
 
 

UDP实现网络通信程序的更多相关文章

  1. VC++ UDP网络控制台程序

     采用的是VC2008,控制台应用程序,使用UDP编写. 1.服务端代码 //UDPServer.cpp #include <WinSock2.h> #include <stdio. ...

  2. 【网络编程01】socket的基础知识-简单网络通信程序

    1.什么是socket socket(套接字),简单来说是IP地址与端口(port)的组合,可以与远程主机的应用程序进行通信.通过IP地址可以确定一台主机,而通过端口则可以确定某一个应用程序.IP+端 ...

  3. QT UDP聊天小程序

    利用QT的UDP技术,实现两个QT程序之间的聊天程序. #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include < ...

  4. 网络编程(UDP协议-聊天程序)

    网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...

  5. UDP SOCKET网络通信 C#

    接收端 using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Thread ...

  6. 关于基于.NET Framework的网络通信程序底层扫盲

    引自<三维游戏引擎的设计与实现>书中9.3节:          如果服务端在.Net Framework基础上开发,那么可以直接选择使用.Net Framework提供的Socket类, ...

  7. 使用DotNetty编写跨平台网络通信程序

    长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架.终于微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点, ...

  8. 使用UDP完成网络通信

    语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用UDP来 传输数据提高效率. 因为UDP本身不可靠传输的特性,为了保证玩家可靠的接入服务器和一些 操作的正确执行,还是需要一些额外的代码保证U ...

  9. Eclipse中用两个控制台测试网络通信程序

    1.启动发送端和接收端程序,这时在控制台可以看到两个程序在运行,如下图. 2.这种情况下只有一个控制台窗口,不便于测试程序,于是新建一个控制台窗口,如下图. 3.这时可以发现已经有了两个控制台窗口了, ...

随机推荐

  1. 移动端meta标签的使用和设置

    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale= ...

  2. html+css中常见的浏览器兼容性处理

    1.居中问题 div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin: 0 auto; 2.高度问题 两上下排列或嵌套的div,上面的div设置高度(height),如果di ...

  3. Java中避免空指针的几个方法

    equals Object类中的equals 方法在非空对象引用上实现相等关系,具有对称性 x.equals(y) 和 y.equals(x) 结果是一样的,但当x == null时会抛出空指针异常 ...

  4. 转:hive-列转行和行转列

    1. 假设我们在hive中有两张表,其中一张表是存用户基本信息,另一张表是存用户的地址信息等,表数据假设如下: user_basic_info: id name 1 a 2 b 3 c 4 d use ...

  5. 01_微信小程序支付

    [支付流程] 1.小程序内调用登录接口,获取到用户的openid(我们这一步骤让前端去获取) 2.服务端代码这边生成订单 3.服务端调用支付统一下单的api 4.服务端将再次签名,返回5个参数(前端得 ...

  6. ANN神经网络——实现异或XOR (Python实现)

    一.Introduction Perceptron can represent AND,OR,NOT 用初中的线性规划问题理解 异或的里程碑意义 想学的通透,先学历史! 据说在人工神经网络(artif ...

  7. 【网络编程】TCP网络编程

    TCP网络程序设计 一.模型函数化 图片:TCP编程模型 1.1 创建套接字Socket #include <sys/types.h> /* See NOTES */ #include & ...

  8. JSON中的安全问题

    Web中使用JSON时最常见的两个安全问题: 1.跨站请求伪造: 即CSRF,是一种利用站点对用户浏览器信任发起攻击的方式.典型的就是JSON数组,更多信息请自行上网百度. 2.跨站脚本攻击. 是注入 ...

  9. win10下Java环境配置

    JAVA_HOME : E:\ensoft\jdk(这个是jdk安装路径) CLASSPATH : .;E:\ensoft\jdk\lib;E:\ensoft\jdk\lib\dt.jar;E:\en ...

  10. 设计模式:代理(Proxy)模式

    设计模式:代理(Proxy)模式 一.前言    代理模式或许我们都听说过,至少知道代理(Proxy)这个东西的,否则看这篇博客也没任何意义的.什么叫做代理,代理是代替服务器去接受请求者的请求的中间人 ...