基于 IP 多播的网络会议程序(2024)

1.题目描述

局域网 IP 多播程序,设计一个图形界面的网络会议程序(实现文本多播方式即可)。


2.演示Demo


3.参考代码

广播发送代码

cpp 复制代码
//服务端
#include <winsock2.h>
#include <iostream>
#include <list>

#pragma comment(lib, "ws2_32.lib")
using namespace std;

// 线程处理函数12
DWORD WINAPI ThreadFun(LPVOID lpThreadParameter);

void init_app();

void Send_All(list<SOCKET> Client_List_Now, char *msg, SOCKET This_Socket);

void *Send_Msg(void *pVoid);

SOCKET Socket;
list<SOCKET> Client_List;
sockaddr_in addrClient;

int len = sizeof(sockaddr_in);


int main() {
    init_app();
    pthread_t tids;
    pthread_create(&tids, NULL, Send_Msg, &Socket);
    //主线程循环接收客户端的连接
    while (true) {
        // 接受成功返回与client通讯的Socket
        SOCKET Client = accept(Socket, (SOCKADDR *) &addrClient, &len);
        if (Client != INVALID_SOCKET) {
            // 创建线程,并且传入与client通讯的套接字
            HANDLE hThread = CreateThread(NULL, 0, ThreadFun, (LPVOID) Client, 0, NULL);
            CloseHandle(hThread); // 关闭对线程的引用
        }
    }
}

void *Send_Msg(void *pVoid) {
    char *msg;
    do {
        cout << " 发送广播:" ,cin>> msg ;
        Send_All(Client_List, msg, NULL);
    } while (true);

}

DWORD WINAPI ThreadFun(LPVOID lpThreadParameter) {
    // 接受数据
    SOCKET This_Socket = (SOCKET) lpThreadParameter;
    cout << " "<<This_Socket << "加入广播" << endl;
    Client_List.push_back(This_Socket);

    // 循环接收客户端状态
    int ret = 0;
    do {

        char buf2[100] = {0};
        ret = recv(This_Socket, buf2, 100, 0);
    } while (ret != SOCKET_ERROR && ret != 0);

    Client_List.remove(This_Socket);
    cout << This_Socket << "离线" << endl;
    return 0;
}

void Send_All(list<SOCKET> Client_List_Now, char *msg, SOCKET This_Socket) {
    if (This_Socket != NULL)
        Client_List_Now.remove(This_Socket);
    for (auto iter: Client_List_Now) {
        send(iter, msg, strlen(msg), 0);
    }
}

void init_app() {
    cout << "===========服务端============" << endl;
    WSADATA wd;
    if (WSAStartup(MAKEWORD(2, 2), &wd) != 0) {
        cout << "WSAStartup Error:" << WSAGetLastError() << endl;
        return;
    }
    // 创建流式套接字
    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (Socket == INVALID_SOCKET) {
        cout << "socket error:" << WSAGetLastError() << endl;
        return;
    }
    //绑定端口和ip
    sockaddr_in addr;
    memset(&addr, 0, sizeof(sockaddr_in));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8000);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    //服务端bind绑定
    if (bind(Socket, (SOCKADDR *) &addr, len) == SOCKET_ERROR) {
        cout << "bind Error:" << WSAGetLastError() << endl;
        return;
    }
    // 监听20个以下设备
    listen(Socket, 20);
}

广播接收代码

cpp 复制代码
//
// Created by 123 on 2024-1-2.
//
#include<winsock2.h>//winsock2的头文件
#include<iostream>

using namespace std;

void init_app();

#pragma comment(lib, "ws2_32.lib")

SOCKET Socket;

//客户端
int main() {
    init_app();
    //接收服务端的消息
    do {
        int ret = 0;
        do {
            char buf[100] = {0};
            ret = recv(Socket, buf, 100, 0);
            if(ret != SOCKET_ERROR && ret != 0)
            cout << " 收到广播: " << buf << endl;
        } while (ret != SOCKET_ERROR && ret != 0);

    } while (true);
}
void init_app() {
    cout << "===========客户端============" << endl;
    WSADATA wd;
    //加载winsock2的环境
    if (WSAStartup(MAKEWORD(2, 2), &wd) != 0) {
        cout << "WSAStartup  error:" << GetLastError() << endl;
        return;
    }
    //创建流式套接字
    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (Socket == INVALID_SOCKET) {
        cout << "socket  error:" << GetLastError() << endl;
        return;
    }
    //链接服务器
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8000);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    int len = sizeof(sockaddr_in);
    if (connect(Socket, (SOCKADDR *) &addr, len) == SOCKET_ERROR) {
        cout << "connect  error:" << GetLastError() << endl;
        return;
    }
}

4.导入ws2_32库到Clion :

导入ws2_32库到Clion项目-CSDN博客

2024 HNUST计算机网络课程设计-(ᕑᗢᓫ∗)˒芒果酱-参考文章

代码可以参考,૮₍ ˃ ⤙ ˂ ₎ა 但同学们要认真编写哦


1、网络聊天程序的设计与实现
C++ Socket 多线程 网络聊天室 支持用户端双向交流(2023)-CSDN博客

2、Tracert 与 Ping 程序设计与实现
Tracert 与 Ping 程序设计与实现(2024)-CSDN博客

3、滑动窗口协议仿真
滑动窗口协议仿真(2024)-CSDN博客

4、OSPF 路由协议原型系统设计与实现
OSPF 路由协议原型系统设计与实现-CSDN博客

5、基于 IP 多播的网络会议程序
基于 IP 多播的网络会议程序(2024)-CSDN博客

6、编程模拟 NAT 网络地址转换
编程模拟 NAT 网络地址转换(2024)-CSDN博客

7、网络嗅探器的设计与实现
网络嗅探器的设计与实现(2024)-转载-CSDN博客

8、网络报文分析程序的设计与实现
网络报文分析程序的设计与实现(2024)-CSDN博客

9、简单 Web Server 程序的设计与实现
简单 Web Server 程序的设计与实现 (2024)-CSDN博客

10、路由器查表过程模拟

计算机网络 - 路由器查表过程模拟 C++(2024)-CSDN博客

相关推荐
FreeBuf_5 小时前
最新研究揭示云端大语言模型防护机制的成效与缺陷
网络·安全·语言模型
网硕互联的小客服9 小时前
如何利用Elastic Stack(ELK)进行安全日志分析
linux·服务器·网络·安全
浩浩测试一下10 小时前
Authpf(OpenBSD)认证防火墙到ssh连接到SSH端口转发技术栈 与渗透网络安全的关联 (RED Team Technique )
网络·网络协议·tcp/ip·安全·网络安全·php
leagsoft_100310 小时前
联软NSPM自动化策略管理 助力上交所加速国产化替代提升运维效率
运维·网络·自动化
孤寂大仙v11 小时前
【计算机网络】网络层IP协议与子网划分详解:从主机通信到网络设计的底层逻辑
tcp/ip·计算机网络·php
Think Spatial 空间思维11 小时前
【实施指南】Android客户端HTTPS双向认证实施指南
android·网络协议·https·ssl
昔我往昔12 小时前
https和http有什么区别-http各个版本有什么区别
网络协议·http·https
漫步者TZ12 小时前
【Netty系列】解决TCP粘包和拆包:LengthFieldBasedFrameDecoder
java·网络协议·tcp/ip·netty
leagsoft_100312 小时前
筑牢企业网管域安全防线,守护数字核心——联软网管域安全建设解决方案
网络·安全·网络安全
苦学编程的谢13 小时前
Java网络编程API 1
java·开发语言·网络