【网络编程】UDP实现网络通信(C语言、Ubuntu实现)

news2024/9/20 7:50:56


代码实现:分为udpSer.c(服务器端)和udpCli.c(客户端)

//udpSer.c
#include <myhead.h>

#define SER_PORT 9999
#define SER_IP "192.168.83.128"

int main(int argc, 	const char *argv[])
{
	//1、创建用于通信的服务器套接字文件描述符
	int sfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sfd == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("sfd = %d\n", sfd);      //3

	//端口号快速重用
	int reuse = 1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}
	printf("端口号快速重用成功\n");

	//2、绑定ip地址和端口号
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);

	//2.2绑定工作
	if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");
	

	//3、数据收发
	char buf[128] = "";
	struct sockaddr_in cin;       //接受对端地址信息
	socklen_t addrlen = sizeof(cin);

	while(1)
	{
		//清空容器
		bzero(buf,sizeof(buf));

		//从套接字中读取数据
		recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cin,&addrlen);

		printf("收到消息为:%s\n",buf);

		strcat(buf,"*+*");
		if((sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)&cin,sizeof(cin))) == -1)
		{
			perror("发送 error");
			return -1;
		}
	}

	//4、关闭文件描述符
	close(sfd);
	return 0;
}
//udpCli.c
#include <myhead.h>

#define SER_PORT 9999
#define SER_IP "192.168.83.128"
#define CLI_PORT 3333
#define CLI_IP "192.168.83.128"

int main(int argc, 	const char *argv[])
{
	//1、创建用于通信的服务器套接字文件描述符
	int cfd = socket(AF_INET,SOCK_DGRAM,0);
	if(cfd == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("cfd = %d\n", cfd);      //3

	//将端口号快速重用
	int reuse = 1;
	if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
	{
		perror("setsockopt error");
		return -1;
	}
	printf("端口号快速重用成功\n");

	//2、绑定ip地址和端口号
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(CLI_PORT);
	cin.sin_addr.s_addr = inet_addr(CLI_IP);

	//2.2绑定工作
	if(bind(cfd,(struct sockaddr *)&cin,sizeof(cin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");


	//3、数据收发
	char buf[128] = "";
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);

	while(1)
	{
		printf("请输入>>>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf) - 1] = 0;


		//将数据发送给服务器
		sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("发送成功\n");

		bzero(buf,sizeof(buf));

		recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
		printf("收到服务器消息为:%s\n",buf);

	}

	//4、关闭文件描述符
	close(cfd);
	return 0;
}

输出结果如下:成功从客户端发送信息到服务器中

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

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

相关文章

AI大模型学习之白话笔记(三) -- Assistants API入门

经过上面两篇文章的学习&#xff0c;恭喜你开始进入了人工智能的世界&#xff01;在这篇文章中&#xff0c;你将跟我一起学习如何使用Assistants API快速构建一个针对特定领域的人工智能助手。 我们从基础开始&#xff0c;一步步带你用Assistants API完成一个应用的整个过程。…

智能分析/视频汇聚EasyCVR安防视频融合管理云平台技术优势分析

安防行业的发展历程主要围绕视频监控技术的不断改革升级&#xff0c;从最初的模拟监控到数字监控&#xff0c;再到高清化、网络化监控&#xff0c;直至现在的智能化监控&#xff0c;每一次变革都推动了行业的快速发展。特别是近年来&#xff0c;随着AI、大数据、物联网等技术的…

Proxmox LXC 部署ubuntu,centos

前言CT 在 Proxmox VE 中,“CT”是 Container(容器)的缩写。PVE 支持两种主要类型的容器:LXC 和 OpenVZ(针对较旧的 Linux 内核)。这些容器提供了一种轻量级的虚拟化方式,允许用户在一个操作系统实例上运行多个隔离的系统环境。 PVE CT 特别是指在 Proxmox 平台上创建…

深入探索MySQL C API:使用C语言操作MySQL数据库

目录 引言 一. MySQL C API简介 二. MySQL C API核心函数 2.1 初始化和连接 2.2 配置和执行 2.3 处理结果 2.4 清理和关闭 2.5 错误处理 三. MySQL使用过程 四. 实现CRUD操作 4.1 创建数据库并建立表 ​编辑 4.2 添加数据&#xff08;Create&#xff09; ​编辑 …

idea git 重新登录

&#xff08;切换本地项目绑定的git账户&#xff09; git config --system --unset credential.helper git config user.name git pull &#xff08;然后输入用户名&#xff08;输绑定邮箱&#xff09;&#xff0c;密码&#xff09;

easyExcel2.1.6自动trim()的问题

环境&#xff1a;easyExcel 2.1.6 问题&#xff1a;easyExcel会自动忽略String中的空格&#xff0c;调用trim()函数&#xff0c;导致excel中的空格失效。 代码如上所示&#xff0c;所以只需要把globalConfiguration的autoTrim()&#xff0c;设置为false即可 那么怎么设置confi…

stable diffusion学习(1)成功打开WEBUI

建议学习github上的资源 GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 1.下载安装sd.webui.zip 1.1 Release v1.0.0-pre AUTOMATIC1111/stable-diffusion-webui GitHub 1.2安装python&#xff0c;设置阿里镜像 python -m pip config set gl…

Linux桥转发经过的netfilter钩子点

你是否也有这样的疑问&#xff0c;当我们路由器局域内的下挂设备&#xff0c;是怎么互相访问的呢。假设我的路由器当前的网段是192.168.1.1&#xff0c;有一台PC有线接入&#xff0c;IP地址为 192.168.1.142 &#xff0c;一台手机WiFi接入&#xff0c;IP地址为192.168.1.223&am…

FRTIMP_YTFRB_WEB

FRTIMP_YTFRB_WEB 林业资源交易信息管理平台

基于深度生物学引导辅助学习的多模态数据整合和插补来改进基因型-表型预测

DeepGAMI: deep biologically guided auxiliary learning for multimodal integration and imputation to improve genotype–phenotype prediction 代码&#xff1a;https://github.com/daifengwanglab/DeepGAMI abstract&#xff1a; background&#xff1a;基因型与疾病表…

【数据结构之C语言实现栈】

1.栈 的 概 念 与 结 构 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据的插入和删除操作的一端称为栈顶&#xff0c;另一…

【代码随想录训练营第42期 Day26打卡 贪心Part1 - LeetCode 455.分发饼干 376. 摆动序列 53. 最大子序和

目录 一、贪心 二、题目与题解 题目一&#xff1a;455.分发饼干 题目链接 题解&#xff1a;排序双指针贪心 题目二&#xff1a;376. 摆动序列 题目链接 题解&#xff1a;贪心 题目三&#xff1a;53. 最大子序和 题目链接 题解1&#xff1a;暴力&#xff08;失败&…

立体相机镜面重建(二)双目立体镜面重建

使用双目相机&#xff0c;配合镜子、屏幕&#xff0c;可以直接获得镜面的三维数据&#xff0c;无需先验知识。因此使用双目镜面重建方式对镜子表面进行重建。 &#xff08;一&#xff09;重建步骤 使用左相机光线法来计算镜面点&#xff1a; 1.取一个像素点&#xff0c;计算其…

linux中安装达梦DM8

目录 场景&#xff1a; 安装准备 安装 新建 dmdba 用户 修改文件打开最大数 创建实例保存目录、归档保存目录、备份保存目录。 挂载镜像&#xff0c;命令行安装 ​编辑 配置环境变量 配置实例-命令行方式初始化实例 命令行注册服务 命令行启停数据库 数据库连接测试…

计算机网络部分基础知识

网络协议的意义 单台主机内部的设备之间需要发送和接收消息&#xff0c;那么和相隔很远的两台主机之间发送消息有什么区别呢&#xff1f;两台主机通过网络发送消息&#xff0c;相当于两个网卡设备之间进行通信&#xff0c;最大的区别在于距离变长了。而距离变长带来的结果就是&…

Gartner发布中国MDR托管检测和响应服务市场指南:中国不同类型的机构对MDR的需求对比

中国企业正越来越多地受益于提供现代安全运营中心功能的托管检测和响应服务。中国首席信息官和安全领导者应利用这项研究来了解中国的托管检测和响应市场及其动态。 主要发现 根据 CYBERSECURITY REVIEWS 的《2023 年中国网络安全运营市场研究报告》&#xff0c;超过 97%的中国…

【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)

三、基本操作 文章目录 三、基本操作1.图的遍历1.1 深度优先遍历DFS1.1.1 DFS算法1.1.2 DFS算法的性能分析1.1.3 深度优先的生成树和生成森林 1.2 广度优先遍历BFS1.2.1 BFS算法1.2.2 BFS算法性能分析1.2.3 广度优先的生成树和生成森林 1.3 图的遍历与图的连通性 1.图的遍历 图…

synergy A problem occurred during installation, try installing.

系统&#xff1a;macos m2 解决方式&#xff1a; 在 ~/Library/LaunchAgents/ 目录下, 新建 com.symless.synergy3.plist 文件&#xff0c;并chown为当前用户。初始化成功

Latex或者word里面mathtype类型的数学公式如何变成mathematica里面的形式

详细步骤如下&#xff1a; 第一步&#xff1a;Latex里面的公式复制粘贴到word里面&#xff0c;转变成mathtype类型的数学公式&#xff08;若已经是word里面mathtype类型的数学公式&#xff0c;这一步可以省略&#xff09;&#xff0c;如下&#xff1a; 第二步&#xff1a;将ma…

探索SD NAND配套测试工具:工程师的得力助手

在快速发展的存储技术领域&#xff0c;SD NAND因其高速读写、低功耗和高可靠性而广受青睐。然而&#xff0c;对于工程师来说&#xff0c;验证SD NAND的性能并非易事&#xff0c;为了便于工程师验证&#xff0c;MK 米客方德开发设计了SD NAND配套测试工具。 一、SD NAND转接板简…