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

这篇具有很好参考价值的文章主要介绍了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 * 25
	cls();											//清屏
	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 * 25
	cls();											//清屏
	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);

仅供学习文章来源地址https://www.toymoban.com/news/detail-598914.html

到了这里,关于C语言的UDP多线程点对点发送消息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C/C++ Socket UDP 广播消息的发送与接收

    局域网内全网段广播消息的IP地址为:255.255.255.255,向该IP地址发送广播消息,局域网下的任何网段的客户机都能收到广播。 对于发送端,如果你只想给某个特定的网段发送消息,例如你的IP地址为192.168.31.107,那么你的广播地址是192.168.31.255,向该广播地址发送广播消息,只

    2024年02月12日
    浏览(38)
  • Spring Boot 3 + Vue 3 整合 WebSocket (STOMP协议) 实现广播和点对点实时消息

    🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正! WebSocket是一种在Web浏览器与Web服务器之间建立双向通信的协议,而Spring Boot提供了便捷的WebSocket支持

    2024年02月02日
    浏览(50)
  • 区块链系统:点对点交易原理

    比特币的交易是一种无需信任中介参与的P2P(Peer-to-peer)交易。 传统的电子交易,交易双方必须通过银行这样的信任机构作为中介,这样可以保证交易的安全性,因为银行记录了交易双方的账户资金,能保证在一笔交易中,要么保证成功,要么交易无效,不存在一方到账而另

    2024年02月15日
    浏览(44)
  • java 发送和接收udp数据 udp数据帧结构

    项目开发中,有个需求是接收udp的组播信息,获取帧并解析其中的内容。之前没有接触过udp的通讯以及数据帧。查阅资料对udp的通讯间的发送与接收实现记录如下。 UDP有三种通讯方式,分别是, 单播 、广播、还有组播。 单播 : 单机与单机之间的通讯 广播 : 当前主机与所在

    2024年02月02日
    浏览(35)
  • DragGAN-点对点的手动P图

    原文网站link以及论文链接: https://vcai.mpi-inf.mpg.de/projects/DragGAN/ https://arxiv.org/pdf/2305.10973.pdf 深度生成模型近年在合成随机真实感图像方面取得了不错的成绩。在现实世界的应用中,这种基于学习的图像合成方法中一个关键功能是对合成视觉内容的可控性。为了满足这种需求,

    2024年02月08日
    浏览(43)
  • 华为防火墙IPsec点对点配置解析

    主机直连的接口为trust区域,防火墙之间互联的接口为untrust区域 ike proposal xx //首先创建ike proposal xx 这一步的作用就是创建协商ike SA的时候使用的相关安全套件,默认防火墙就会设置了一些默认的安全套件的组合。这一步设置的内容就是用于IKE SA的协商,IPsec双方使用协商好的

    2024年02月05日
    浏览(46)
  • SpringBoot整合 websocket 实现群聊,点对点聊天

    1.websocket websocket最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。浏览器和服务器只需要要做一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。 第一、WebSocket是HTML5中的协议,支

    2024年02月08日
    浏览(39)
  • 思科路由器点对点故障的解决方法

    思科路由器采用CPOS接口,节省了一个TM传输设备,配线也简单多了,同时还节省很多的同轴电缆,用一根光纤全部解决,CPOS接口内部分为了多个接口,通过这种接口可以用一个端口与多个物理接口相连。   这种连接和帧中继、X.25的虚连接不同,实际上仍然是物理相连,在传

    2024年02月05日
    浏览(52)
  • BSV 上的点对点结算衍生品:远期合约

    远期合约是两方在特定未来时间以预定价格买卖资产的衍生工具。它是一种非常常见的对冲波动性的工具。因此,使用 USD 远期合约可以对冲 USD 兑 BSV 汇率的波动。 远期合约的收益图 例如,Alice 与 Bob 签订了一份 USD 远期合约。Alice 同意从现在起一个月后以每 BSV 100 USD 的价格

    2024年01月20日
    浏览(54)
  • VB点对点聊天文件传输系统设计与实现

    本程序使用VB语言编程,使用WinSock控件完成的点对点(P2P)聊天和文件传输程序。可以实现两台机器间互发消息,并且有聊天和文件传输记录,安全可靠。 p2p WinSock,聊天和文件传输程序,VB P2P是一种技术,但更多的是一种思想,有着改变整个互联网基础的潜能的思想。

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包