基于 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博客

相关推荐
幽兰的天空1 小时前
介绍 HTTP 请求如何实现跨域
网络·网络协议·http
lisenustc1 小时前
HTTP post请求工具类
网络·网络协议·http
心平气和️2 小时前
HTTP 配置与应用(不同网段)
网络·网络协议·计算机网络·http
心平气和️2 小时前
HTTP 配置与应用(局域网)
网络·计算机网络·http·智能路由器
Gworg2 小时前
网站HTTP改成HTTPS
网络协议·http·https
Mbblovey2 小时前
Picsart美易照片编辑器和视频编辑器
网络·windows·软件构建·需求分析·软件需求
北顾南栀倾寒3 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
GZ_TOGOGO4 小时前
PIM原理与配置
网络·华为·智能路由器
7ACE4 小时前
Wireshark TS | 虚假的 TCP Spurious Retransmission
网络·网络协议·tcp/ip·wireshark·tcpdump
大丈夫立于天地间5 小时前
ISIS基础知识
网络·网络协议·学习·智能路由器·信息与通信