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 :
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、路由器查表过程模拟