C语言的UDP多线程点对点发送消息

windows下使用Dev C++调试

Server段:

/**
 * 编译命令:gcc udps.c -lws2_32 -lmycon -lwinmm -o us.exe
 */

#include <stdio.h>
#include <winsock2.h>
#include <mycon.h>struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
int nclientaddrlen = sizeof(clientaddr);
char sendData[256];
char recvData[256];
SOCKET serversocket;
int isrunning = 1;//接收消息的函数,单独一个线程中运行
void receive_msg()
{while (1){//接收来自聊天对方的消息int ret = recvfrom(serversocket, recvData, 256, 0,  \(struct sockaddr *)&clientaddr, &nclientaddrlen);if (ret > 0){recvData[ret] = '\0';					//填充字符串结束符'\0'printf("来自%s的新消息:%s\n", inet_ntoa(clientaddr.sin_addr), recvData); //如果消息是bye,则退出聊天if (!strcmp(recvData, "bye")){isrunning = 0;printf("系统退出!");return;}}}
}int main(int argc, char* argv[])
{set_title("基于UDP的简单聊天程序服务器端");	//设置窗口标题set_size(80, 25);								//设置窗口为80 * 25cls();											//清屏printf("天天聊天室欢迎你!\n\n");//初始化动态链接库ws2_32.dll,协商版本WSADATA wsaData;WORD sockVersion = MAKEWORD(2, 2);if (WSAStartup(sockVersion, &wsaData) != 0){return 0;}//创建套接字serversocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (serversocket == INVALID_SOCKET){printf("Socket创建错误!");return 0;}//绑定协议、端口和地址serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(6666);			//将端口6666转换为网络字节序serveraddr.sin_addr.S_un.S_addr = INADDR_ANY;if (bind(serversocket, (struct sockaddr *)&serveraddr,  \sizeof(serveraddr)) == SOCKET_ERROR){printf("绑定地址和端口错误!");closesocket(serversocket);return 0;}//启动接收消息线程_beginthread(receive_msg, 0, NULL);while (1){if (!isrunning){break;}//从键盘接收要发送的消息gets(sendData);//发送聊天消息sendto(serversocket, sendData, strlen(sendData), 0,  \(struct sockaddr *)&clientaddr, nclientaddrlen); //如果是bye,则退出聊天if (!strcmp(recvData, "bye")){isrunning = 0;printf("系统退出!");break;}}//结束接收消息的线程_endthread();//关闭套接字并清理释放相关资源closesocket(serversocket); WSACleanup();return 0;
}

Client端:

/**
 * 编译命令:gcc udpc.c -lws2_32 -lmycon -lwinmm -o uc.exe
 */

#include <stdio.h>
#include <winsock2.h>
#include <mycon.h>struct sockaddr_in serveraddr;
int nserveraddrlen = sizeof(serveraddr);
SOCKET clientsocket;
char sendData[256];
char recvData[256];
int isrunning = 1;//接收消息的函数,单独一个线程中运行
void receive_msg()
{while (1){   //接收来自聊天对方的消息int ret = recvfrom(clientsocket, recvData, 256, 0,  \(struct sockaddr *)&serveraddr, &nserveraddrlen);if (ret > 0){recvData[ret] = '\0';					//填充字符串结束符'\0'printf("来自%s的新消息:%s\n", inet_ntoa(serveraddr.sin_addr), recvData); //如果消息是bye,则退出聊天if (!strcmp(recvData, "bye")){isrunning = 0;printf("系统退出!");return;}}}
}int main(int argc, char* argv[])
{set_title("基于UDP的简单聊天程序客户端");		//设置窗口标题set_size(80, 25);								//设置窗口为80 * 25cls();											//清屏printf("天天聊天室欢迎你!\n\n");//初始化动态链接库ws2_32.dll,协商版本WSADATA wsaData;WORD socketVersion = MAKEWORD(2, 2); if (WSAStartup(socketVersion, &wsaData) != 0){return 0;}//创建套接字clientsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//绑定协议、端口和地址struct sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(6666);//聊天端口server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//聊天服务器IP地址int len = sizeof(server);//启动接收消息线程_beginthread(receive_msg, 0, NULL);while (1){if (!isrunning){break;}//从键盘接收要发送的消息gets(sendData);//发送聊天消息sendto(clientsocket, sendData, strlen(sendData), 0,  \(struct sockaddr *)&server, len);//如果是bye,则退出聊天if (!strcmp(recvData, "bye")){isrunning = 0;printf("系统退出!");break;}}//结束接收消息的线程_endthread();//关闭套接字并清理释放相关资源closesocket(clientsocket);WSACleanup();return 0;
}

mycon.h(32位)

#ifndef _WINDOWS_H_
#define	_WINDOWS_H_
#endif//改变控制台窗口大小为width宽,height高
void set_size(int width, int height);//设置控制台窗口的标题为字符串title
void set_title(char *title);//移动光标到坐标(x, y)处,即y行x列
void gotoxy(int x, int y); //隐藏光标
void hide_cursor(void);//显示光标
void show_cursor(void);//设置颜色函数: bcolor背景色,fcolor前景色 
//具体颜色值参见命令行下的color/?命令。
void set_color(int bcolor, int fcolor);//延时函数,单位毫秒
void delay(int dtime);//播放wav格式的声音
void play_sound(const char *sndfile);//清屏
void cls(void);//获取按键
int getkey(void);

mycon.h(64位)

#ifndef _WINDOWS_H_
#define	_WINDOWS_H_
#endif//改变控制台窗口大小为width宽,height高
void set_size(int width, int height);//设置控制台窗口的标题为字符串title
void set_title(char *title);//移动光标到坐标(x, y)处,即y行x列
//假设窗口为25行80列,则左上角的字符坐标为(0, 0),右下角的字符坐标为(79, 24)
void gotoxy(int x, int y); //隐藏光标
void hide_cursor(void);//显示光标
void show_cursor(void);//设置颜色函数: bcolor背景色,fcolor前景色 
//具体颜色值参见命令行下的color/?命令。
void set_color(int bcolor, int fcolor);//延时函数,单位毫秒
void delay(int dtime);//播放wav格式的声音
void play_sound(const char *sndfile);//清屏
void cls(void);//获取按键
int getkey(void);

仅供学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全域Serverless化,华为云引领下一代云计算新范式

近日&#xff0c;华为开发者大会2023&#xff08;Cloud&#xff09;在东莞成功举办&#xff0c;期间“全域Serverless化&#xff0c;引领下一代云计算新范式”专题论坛人气满满。华为云首席产品官方国伟携手业界专家、客户、伙伴&#xff0c;面向广大开发者&#xff0c;分享了在…

【Docker】Docker基本管理命令

目录 一、Docker概述1.1容器化受欢迎的原因1.2Docker核心概念 二、安装 Docker2.1环境准备 三、Doker镜像操作镜像操作选项 四 、Docker 容器操作容器操作选项 一、Docker概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是…

HTTP1.1、HTTPS、HTTP2.0 、HTTP3.0

HTTP1.1 优点&#xff1a; 整体方面&#xff1a;简单、灵活和易于扩展、应用广泛和跨平台 性能方面&#xff1a;长连接、管道网络传输解决请求队头阻塞&#xff08;没有使用&#xff09; 缺点&#xff1a; 安全方面&#xff1a;无状态、明文窃听、伪装、篡改 性能方面&am…

HTML <meter> 标签

实例 使用 meter 元素来度量给定范围(gauge)内的数据: <meter value="3" min="0" max="10">十分之三</meter><meter value="0.6">60%</meter> 浏览器支持 元素ChromeIEFirefoxSafariOpera<meter>8…

JavaWeb课程设计项目实战(03)——开发准备工作

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在正式进入项目开发之前请先完成以下准备工作。 数据库语句 请创建数据库和表并完成数据初始化工作。 初始化数据库 请在MySQL数据库中创建名为studentinformationmanag…

文心一言 VS 讯飞星火 VS chatgpt (59)-- 算法导论6.4 3题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;59&#xff09;-- 算法导论6.4 3题 三、对于一个按升序排列的包含 n 个元素的有序数组 A 来说&#xff0c;HEAPSORT 的时间复杂度是多少?如果 A 是降序呢? 文心一言&#xff1a; 对于一个按升序排列的包含 n 个元素的有序数组…

ffmpeg将视频导出iphonemp4格式

对于短视频的剪辑&#xff0c;目前来说手机性能足够&#xff0c;现在很多家庭如果没有前几年的网课需求基本也不会买电脑。 将mp4视频导入iphone的时候&#xff0c;mp4是容器格式&#xff0c;不是所有mp4格式都支持。用格式工厂一类的转换太慢。所以考虑用ffmpeg。 转换 wmv转…

Spring Boot进阶(54):Windows 平台安装 MongoDB数据库 | 超级详细,建议收藏

1. 前言&#x1f525; Windows如何安装MongoDB数据库及使用呢&#xff1f;这将又会是干货满满的一期&#xff0c;全程无尿点不废话只抓重点教&#xff0c;具有非常好的学习效果&#xff0c;拿好小板凳准备就坐&#xff01;希望学习的过程中大家认真听好好学&#xff0c;学习的途…

Android系统开发-入门篇

参见&#xff1a;[视频教程] 写给应用开发的 Android Framework 教程——玩转 AOSP 篇之 Android 系统开发工具推荐 - 掘金 前置条件&#xff1a; android系统源码位于 linux 服务器&#xff0c;ssh 地址假如为&#xff1a;test172.1.10.2本机为windows 1、本机&#xff1a; 下…

python爬虫试手

同事让帮忙在某个网站爬点数据&#xff0c;首次尝试爬虫&#xff0c;遇到的问题及解决思路记录下。 大体需求是需要爬取详情页内的信息&#xff0c;详情页有一定格式规律&#xff0c;但是详情页需要从列表页跳入&#xff0c;列表页中的每一条记录需要鼠标悬停才会弹出跳转链接…

【课程介绍】XPath 之旅:自动化爬虫入门探索

[ 专栏推荐 ] &#x1f603; 《XPath 之旅&#xff1a;自动化爬虫入门探索》&#x1f604; ❤️【简介】&#xff1a; XPath 基础教程适合初学者&#xff0c;旨在帮助学习者掌握 XPath 元素定位的基本原理和常用技巧。学习完这套课程&#xff0c;你将能够熟练使用 XPath 在 HT…

深入理解mysql的锁和mvcc

基础 1 锁讲解&#xff1a;面试必备-行锁、表锁 - 乐观锁、悲观锁的区别和联系 2 mvcc机制讲解&#xff08;如何实现各种隔离级别&#xff09;&#xff1a;数据库基础&#xff08;四&#xff09;Innodb MVCC实现原理 刚读完上面两篇内容&#xff0c;可能会有很多疑惑的地方&…

repo和git的常用命令

repo 简介 repo是Google开发的用于管理Android版本库的一个工具&#xff0c;repo是使用Python对git进行了一定的封装&#xff0c;并不是用于取代git&#xff0c;它简化了对多个Git版本库的管理。用repo管理的版本库都需要使用git命令来进行操作。因此&#xff0c;使用repo工具…

k8s证书到期实际操作

文章目录 1. 百年的kubeadm1.1 源码修改1.2 准备镜像1.3 编译1.4 成品备份 2. 生成证书2.1 master主节点2.2 其他master节点 1. 百年的kubeadm 1.1 源码修改 源码下载 cd /usr/local/src/ git clone -b release-1.15 https://github.com/kubernetes/kubernetes.git再次确认分…

【Java基础教程】Java学习路线攻略导图——史诗级别的细粒度归纳,持续更新中 ~

Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇7、新特性篇8、常用类库篇 前言 &#x1f37a;&#x1f37a; 各位读者朋友大家好&#xff01;得益于各位朋友的支持和关注&#xff0c;我的专栏《Java基础…

Vue2 - 模板、渲染、事件处理、表单输入绑定

文章目录 模板语法1、文本2、原始 HTML3、属性 Attribute4、使用 JavaScript 表达式 条件渲染1、v-if2、v-else3、v-show4、v-if vs v-show 的区别 列表渲染1、用 v-for 把一个数组映射为一组元素2、维护状态 事件处理1、监听事件 v-on2、事件处理方法3、内联处理器中的方法 表…

【Linux后端服务器开发】UDP协议

目录 一、端口号 二、UDP报头格式 三、UDP的特点 四、UDP协议实现网络聊天群 一、端口号 端口号port标识了一个主机上进行通信的不同的应用程序。 0 ~ 1023&#xff1a;系统端口号&#xff0c;HTTP、FTP、SSH等这些广为使用的应用层协议&#xff0c;它们的端口号都是固定…

随手笔记——OpenCV 的基础使用方法

随手笔记——OpenCV 的基础使用方法 说明CMakeLists.txt关键内容源代码 说明 演示了如下几个操作&#xff1a;图像读取、显示、像素遍历、复制、赋值等。大部分的注解已写在代码里面。编译该程序时&#xff0c;需要在 CMakeLists.txt 中添加 OpenCV 的头文件&#xff0c;然后把…

Qt中QMainWindow的相关介绍

目录 菜单栏 工具栏 状态栏&#xff1a; 停靠窗口&#xff1a; QMainWindow 是标准基础窗口中结构最复杂的窗口&#xff0c;其组成如下: 提供了菜单栏 , 工具栏 , 状态栏 , 停靠窗口 菜单栏&#xff1a;只能有一个&#xff0c;位于窗口的最上方 工具栏&#xff1a;可以有多…

AI制图工具丨Midjourney产品功能介绍

了解如何使用Discord上的Midjourney Bot通过简单的文本提示创建自定义图像 Midjourney是一款AI制图工具&#xff0c;只要关键字&#xff0c;就能透过AI算法生成相对应的图片&#xff0c;只需要不到一分钟。 可以选择不同画家的艺术风格&#xff0c;例如安迪华荷、达芬奇、达利…