当前位置: 首页 > news >正文

网络编程:TCP和UDP通信基础

TCP

简易服务器:

#include<myhead.h>int main(int argc, const char *argv[])
{int oldfd = socket(AF_INET,SOCK_STREAM,0);if(oldfd == -1){perror("socket");return -1;}//绑定要绑定的结构体struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};if(bind(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1){perror("bind");return -1;}//3.监听if(listen(oldfd,BACKLOG) == -1){perror(listen);return -1;}//建立连接struct sockaddr_in client;  //存储客户端信息的结构体int client_len = sizeof(client);int newfd;if((newfd = accept(oldfd,(struct sockaddr *)&client,&client_len)) == -1){perror("accept");return -1;}printf("与%s:%d建立连接\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));char buff[1024];while(1){int res = read(newfd,buff,sizeof(buff));printf("接收到信息:%s\n",buff);strcat(buff,"你好111");write(newfd,buff,res);}return 0;
}

简易客户端:

#include<myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main(int argc, const char *argv[])
{int oldfd = socket(AF_INET,SOCK_STREAM,0);if(oldfd == -1){perror("socket");return -1;}//绑定要绑定的结构体struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};if(connect(oldfd,(struct sockaddr *)&client,&client_len) == -1){perror("connect");return -1;}printf("与服务器建立连接成功\n");//3.收发消息char buff[1024];while(1){fget(buff,sizeof(buff),stdin);write(oldfd,buff,sizeof(buff));read(newfd,buff,sizeof(buff));printf("收到客户端信息:%s\n",buff);bzero(buff,sizeof(buff));}return 0;
}

jTCP服务器:

#include<myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main(int argc, const char *argv[])
{//1.创建套接字int oldfd = socket(AF_INET,SOCK_STREAM,0);if(oldfd == -1){perror("socket");return -1;}//端口号快速复用int n = 2;if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(n)) == -1){perror("setsockopt");return -1;}//2.绑定本机IP和端口号struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};if(bind(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1){perror("bind");return -1;}//3.监听客户端请求if(listen(oldfd,10) == -1) //监听10个客户端{perror("listen");return -1;}struct sockaddr_in client;int client_len = sizeof(client);  //addr_t 就是intint newfd;//4.接收客户端连接请求if((newfd = accept(oldfd,(struct sockaddr *)&client,&client_len))==-1){perror("accept");return -1;}printf("%s:%d连接\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));//5.收发消息char buff[1024];while(1){int res = recv(newfd,buff,sizeof(buff),0);if(res == 0){printf("客户端退出\n");break;}printf("接收到信息:%s,接收到信息的长度:%d\n",buff,res);strcat(buff,"追加一个666");send(newfd,buff,sizeof(buff),0);     //阻塞发送信息bzero(buff,sizeof(buff));}close(oldfd);close(newfd);return 0;
}

TCP客户端:

#include<myhead.h>
#define IP "192.168.191.129"
#define PORT 1234
#define SERPORT 6666int main(int argc, const char *argv[])
{//1.创建套接字int oldfd = socket(AF_INET,SOCK_STREAM,0);if(oldfd == -1){perror("socket");return -1;}//2.绑定客户端struct sockaddr_in client = {.sin_family = AF_INET,.sin_port = htons(PORT), //自定义的端口号.sin_addr.s_addr = inet_addr(IP)};if(bind(oldfd,(struct sockaddr *)&client,sizeof(client)) == -1){perror("bind");return -1;}//3.连接服务器,填充服务器信息struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(SERPORT), //这里端口号需要服务器端口号.sin_addr.s_addr = inet_addr(IP)};if(connect(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1){perror("connect");return -1;}//4.发送和接收char buff[1024];while(1){fgets(buff,sizeof(buff),stdin);buff[strlen(buff)-1] = '\0';send(oldfd,buff,strlen(buff),0);if(strcmp(buff,"quit") == 0)      //退出客户端{break;}bzero(buff,sizeof(buff));recv(oldfd,buff,sizeof(buff),0);     //阻塞接收服务器消息printf("服务器发来消息:%s\n",buff);}return 0;
}

UDP

UDP服务器:

#include<myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main(int argc, const char *argv[])
{//1.创建UDP套接字int oldfd = socket(AF_INET,SOCK_DGRAM,0);if(oldfd == -1){perror("socket");return -1;}//2.绑定struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr .s_addr = inet_addr(IP)};if(bind(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1){perror("bind");return -1;}//收发消息struct sockaddr_in client;int client_len = sizeof(client);char buff[1024];while(1){//接受客户端消息时会将客户短信息写入clientrecvfrom(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&client,&client_len);printf("收到%s:%d的消息:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buff);strcat(buff,"追加10086今天是周六");sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&client,sizeof(client)); //收到谁的信息就发给谁}return 0;
}

UDP客户端:

#include<myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main(int argc, const char *argv[])
{//1.创建套接字int oldfd = socket(AF_INET,SOCK_DGRAM,0);if(oldfd == -1){perror("socket");return -1;}//2.收发消息struct sockaddr_in server = {.sin_family = AF_INET,.sin_port = htons(PORT),.sin_addr.s_addr = inet_addr(IP)};char buff[1024];while(1){fgets(buff,sizeof(buff),stdin);buff[strlen(buff)-1] = '\0';sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&server,sizeof(server));bzero(buff,sizeof(buff));recvfrom(oldfd,buff,sizeof(buff),0,NULL,NULL);printf("接收服务器信息:%s\n",buff);}return 0;
}

练习

在UDP服务器中,使用connect函数,实现唯一的客户端与服务器通话

#include <myhead.h>
#define PORT 6666
#define IP "192.168.191.129"int main() {// 创建UDP socketint sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd == -1){perror("socket");return -1;}// 设置服务器地址struct sockaddr_in server_addr{.sin_family = AF_INET,.sin_port = htons(12345),.sin_addr.s_addr = inet_addr(IP)};// 绑定服务器地址到socketif (bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) == -1){perror("bind");return -1;}// 接收和发送数据char buffer[1024];struct sockaddr_in client_addr;socklen_t addr_len = sizeof(client_addr);// 等待客户端连接if (connect(sockfd, (struct sockaddr *)&client_addr, addr_len) == -1){perror("connect");return -1;}// 与客户端通信while (1){memset(buffer, 0, sizeof(buffer));printf("等待客户端的消息:\n");ssize_t recv_len = recvfrom(sockfd, (char *)buffer, MAX_BUF_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len);if (recv_len == -1){perror("recvfrom");return -1;}printf("接收到客户端消息%s\n", buffer);// 将收到的消息原样发送回客户端ssize_t send_len = sendto(sockfd, (const char *)buffer, strlen(buffer), 0, (const struct sockaddr *)&client_addr, addr_len);if (send_len == -1){perror("sendto");return -1;}}// 关闭socketclose(sockfd);return 0;
}

相关文章:

网络编程:TCP和UDP通信基础

TCP 简易服务器&#xff1a; #include<myhead.h>int main(int argc, const char *argv[]) {int oldfd socket(AF_INET,SOCK_STREAM,0);if(oldfd -1){perror("socket");return -1;}//绑定要绑定的结构体struct sockaddr_in server {.sin_family AF_INET,.…...

声波配网原理及使用python简单的示例

将自定义的信息内容&#xff08;如Wi-Fi配置、数字数据&#xff09;转换为音波是一种音频调制与解调技术&#xff0c;广泛应用于声波配网、数据传输和近场通信中。这项技术的实现涉及将数字信息编码为音频信号&#xff0c;并通过解码还原信息。 实现方法 1. 数字数据编码 将原…...

深度学习任务中的 `ulimit` 设置优化指南

深度学习任务中的 ulimit 设置优化指南 1. 什么是 ulimit&#xff1f;2. 深度学习任务中的关键 ulimit 设置2.1 max locked memory&#xff08;-l&#xff09;2.2 open files&#xff08;-n&#xff09;2.3 core file size&#xff08;-c&#xff09;2.4 stack size&#xff08…...

【学生管理系统】权限管理

目录 6.4 权限管理&#xff08;菜单管理&#xff09; 6.4.1 查询所有&#xff08;含孩子&#xff09; 6.4.2 添加权限 6.4.3 核心3&#xff1a;查询登录用户的权限&#xff0c;并绘制菜单 6.4 权限管理&#xff08;菜单管理&#xff09; 6.4.1 查询所有&#xff08;含孩子…...

Java编程题_面向对象和常用API01_B级

Java编程题_面向对象和常用API01_B级 第1题 面向对象、异常、集合、IO 题干: 请编写程序&#xff0c;完成键盘录入学生信息&#xff0c;并计算总分将学生信息与总分一同写入文本文件 需求&#xff1a;键盘录入3个学生信息(姓名,语文成绩,数学成绩) 求出每个学生的总分 ,并…...

JUC并发工具---线程协作

信号量能被FixedThreadPool代替吗 Semaphore信号量 控制需要限制访问量的资源&#xff0c;没有获取到信号量的线程会被阻塞 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore;public class Sem…...

Excel for Finance 08 `XNPV`和`XIRR` 函数

Excel 的 XNPV 函数用于计算基于特定日期的净现值&#xff08;Net Present Value, NPV&#xff09;。与标准的 NPV 函数相比&#xff0c;XNPV 更灵活&#xff0c;可以考虑不规则的现金流间隔&#xff0c;而不仅限于等间隔的期数。 语法&#xff1a; XNPV(rate, values, dates)…...

嵌入式入门Day35

网络编程 Day2 套接字socket基于TCP通信的流程服务器端客户端TCP通信API 基于UDP通信的流程服务器端客户端 作业 套接字socket socket套接字本质是一个特殊的文件&#xff0c;在原始的Linux中&#xff0c;它和管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号等…...

AE/PR/达芬奇模板:自动光标打字机文字标题移动效果动画模板预设

适用于AE/PR/达芬奇的 Typewriter Pro 该模板包括专业的打字机文本动画&#xff0c;并包含很酷的功能&#xff0c;以及帮助文档和分步画外音视频教程。 主要特点 轻松的持续时间控制您可以通过在持续时间控件中输入 start 和 end duration&#xff08;开始和结束持续时间&…...

RCE漏洞

一、课程知识点 1、远程代码执行漏洞原理与利用 2、常见的代码执行函数 3、常见的命令执行函数 4、常见的绕过姿势 5、命令执行漏洞防范 二、技术目标 1、掌握命令执行漏洞的原理 2、掌握 PHP 命令执行和代码执行的相关函数 3、掌握常见的绕过姿势 4、掌握代码执行漏洞防御措施…...

在开发嵌入式系统时,尤其是处理大数时,会遇到取值范围的问题。51单片机通常没有内建大整数支持,因此我们需要采用不同的方法来解决这一问题

00 两种可行方法分别是&#xff1a; 使用数组存储每一位数据并进行进位运算&#xff1a;通过将大数按位拆分成数组&#xff0c;然后实现逐位加法、进位等操作。使用符号变量进行计算&#xff1a;将数值分成低位和高位&#xff0c;分别用符号变量进行计算。 01&#xff1a;使用…...

【Compose multiplatform教程20】在应用程序中使用多平台资源

为项目设置资源后&#xff0c;生成项目以生成提供资源访问权限的特殊类。要重新生成类和所有资源访问器&#xff0c;请再次生成项目或在 IDE 中重新导入项目。ResRes 之后&#xff0c;您可以使用生成的类从您的代码或外部库访问配置的多平台资源。 自定义访问器类生成 您可以使…...

深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent

阅读原文 渐入佳境 我们都知道&#xff0c;通过编写一个提示词&#xff08;prompt&#xff09;&#xff0c;我们可以引导大模型生成回答&#xff0c;从而开启愉快的人工智能对话&#xff0c;比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程&#xff0c;我们拆成两部分 pr…...

紫光同创-盘古200pro+开发板

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 一、开发系统介绍 开发系统概述 MES2L676-200HP 开发板采用紫光同创 logos2 系列 FPGA&#xff0c;型号&#xff1a;…...

iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针

iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针-CSDN博客 类型含义使用场景示例nil表示一个指向 Objective - C 对象的空指针。在 Objective - C 和 Swift&#xff08;与 Objective - C 交互时&#xff09;中用于表示对象不存在。当一个对象变量没有指向任何有效的对象实例…...

【优选算法】有效三角形的个数(双指针算法)

优质专栏&#xff1a;算法_云边有个稻草人的博客-CSDN博客 目录 【611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09;】 解法一&#xff1a; 解法二&#xff1a; 【611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09;】 解法一&#xff1a; 三层for…...

中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern) 和 策略模式(Strategy Pattern)

中介者模式&#xff08;Mediator Pattern&#xff09;、桥接模式&#xff08;Bridge Pattern&#xff09; 和 策略模式&#xff08;Strategy Pattern&#xff09; 都是常见的设计模式&#xff0c;它们解决不同类型的问题。我们将通过 Swift 示例来说明它们的使用场景&#xff0…...

客户案例:基于慧集通打通聚水潭电商ERP与用友U8系统集成之路

一、引言 本原型客户是 生物科技公司&#xff0c;其公司系列抗菌抗病毒产品广泛应用于医疗用品、纺织服饰、家纺用品、母婴护理、女性用品、个人防护等多个领域。在知识产权方面&#xff0c;公司在专业领域已获得商标和专利近百项&#xff0c;创新能力得到了国家及行业内普遍认…...

阿里云clb是什么

传统型负载均衡服务 ‌阿里云CLB&#xff08;Classic Load Balancer&#xff09;是阿里云提供的一种传统型负载均衡服务&#xff0c;主要用于将访问流量根据转发策略分发到后端多台云服务器。‌‌ CLB的定义和功能 CLB是一种流量分发控制服务&#xff0c;通过设置虚拟服务地…...

【Cursor编辑器】自用经验和实操(迭代更新)

1.启动composer crtl I 2.生成直接一直问加载 3. 实操 生成个知识图谱&#xff0c;使用csv文件里面的数据创关系和节点。...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...