6.19作业
TCP服务器
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>#define PORT 8888
#define IP "192.168.124.39"#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\fprintf(stderr,"func:%s",__func__);\perror(msg);\}while(0)int main(int argc, const char *argv[])
{//创建流式套节奏int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}printf("流式套节奏创建完毕 sfd=%d\n",sfd);//允许端口快速被复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用\n");//填充服务器地址信息结构体给bind函数使用//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ipstruct sockaddr_in sin;sin.sin_family=AF_INET;//必须填AF_INETsin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式//绑定服务器地址信息,必须绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bing");return -1;}//将套节奏设置为被动监听状态if(listen(sfd,128)<0){ERR_MSG("listen");return -1;}printf("监听成功\n");//获取连接成功的客户端信息,生成一个新的套节奏文件描述符struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);int newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){ERR_MSG("accpet");return -1;}printf("[%s:%d] newfd=%d 客户端链接成功\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);char buf[128]="";ssize_t res;char buf2[128]="";ssize_t res2;while(1){bzero(buf,sizeof(buf));//接收res=recv(newfd,buf,sizeof(buf),0);if(res<0){ERR_MSG("recv");return -1;}else if(res==0){printf("[%s:%d]客户端下线\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));break;}printf("[%s:%d]newfd=%d: %s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);//发送res2=send(newfd,buf,sizeof(buf),0);if(res2<0){ERR_MSG("send");return -1;}printf("发送成功\n");}//关闭文件描述符if(close(sfd)<0){ERR_MSG("close");return -1;}return 0;
}
TCP客服端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>#define PORT 8888
#define IP "192.168.124.38"#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d\n",__LINE__);\fprintf(stderr,"func:%s\n",__func__);\perror(msg);\}while(0)int main(int argc, const char *argv[])
{//创建流式套节奏int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd<0){ERR_MSG("socket");return -1;}printf("流式套节奏创建完毕 cfd=%d\n",cfd);//填充服务器地址信息结构体给bind函数使用//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ip/*struct sockaddr_in sin;sin.sin_family=AF_INET;//必须填AF_INETsin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式*/struct sockaddr_in sin2;sin2.sin_family=AF_INET;//必须填AF_INETsin2.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin2.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式//绑定客户端地址信息,不是必须绑定//未绑定由于电脑自动分配一个端口号/*if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bing");return -1;}*///链接指定的服务器if(connect(cfd,(struct sockaddr*)&sin2,sizeof(sin2))<0){ERR_MSG("connect");return -1;}printf("连接服务器[%s:%d]成功\n",IP,PORT);char buf[128]="hello";ssize_t res;char buf2[128]="";ssize_t res2;while(1){bzero(buf,sizeof(buf2)); //发送printf("请输入:");fgets(buf2,sizeof(buf2),stdin);res2=send(cfd,buf2,sizeof(buf2),0);if(res2<0){ERR_MSG("send");return -1;}printf("发送成功\n");//接收bzero(buf,sizeof(buf));res=recv(cfd,buf,sizeof(buf),0);if(res<0){ERR_MSG("recv");return -1;}else if(res==0){printf("[%s:%d]cfd=%d服务器下线\n",IP,PORT,cfd);break;}printf("[%s:%d]newfd=%d : %s\n",IP,PORT,cfd,buf);}//关闭文件描述符if(close(cfd)<0){ERR_MSG("close");return -1;}return 0;
}
UDP服务器
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 6666
#define IP "192.168.124.39"#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\fprintf(stderr,"func:%s",__func__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{//创建报式套节字int sfd = socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("sfd");return -1;}printf("报式套接字创建成功,sfd=%d\n",sfd);//允许端口快速被复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用\n");//填充服务器的地址信息结构体给bind函数使用//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ipstruct sockaddr_in sin;sin.sin_family=AF_INET;//必须填AF_INETsin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式//绑定服务器的地址信息,必须绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bing");return -1;}printf("绑定成功\n");char buf[128]="";struct sockaddr_in cin;//存储接收到的对端的地址信息socklen_t addrlen=sizeof(cin);while(1){bzero(buf,sizeof(buf));//接收数据//if(recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL)<0){if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0){ERR_MSG("recvrom");return -1;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);//发送数据strcat(buf,"*-*");if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0){ERR_MSG("sendto");return -1;}printf("发送成功\n");}//关闭套接字文件描述符close(sfd);return 0;
}
UDP客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 6666
#define IP "192.168.124.39"#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\fprintf(stderr,"func:%s",__func__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{//创建报式套节字int sfd = socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("sfd");return -1;}printf("报式套接字创建成功,sfd=%d\n",sfd);//允许端口快速被复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用\n");//填充服务器的地址信息结构体给bind函数使用//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ip//填充对端地址信息结构体,给sestruct sockaddr_in sin;sin.sin_family=AF_INET;//必须填AF_INETsin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式//绑定服务器的地址信息,必须绑定/*if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bing");return -1;}printf("绑定成功\n");*/char buf[128]="";char buf2[128]="";struct sockaddr_in cin;//存储接收到的对端的地址信息socklen_t addrlen=sizeof(cin);while(1){bzero(buf2,sizeof(buf));//发送数据printf("请输入:");fgets(buf2,sizeof(buf2),stdin);buf[strlen(buf)-1]='\0';if(sendto(sfd,buf2,sizeof(buf2),0,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}printf("发送成功\n");bzero(buf,sizeof(buf));//接收数据//if(recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL)<0){if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0){ERR_MSG("recvrom");return -1;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);}//关闭套接字文件描述符close(sfd);return 0;
}
相关文章:
6.19作业
TCP服务器 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <string.h>#define PORT 8888 #define IP "192.168.124.39&q…...
java 线程之间通信-volatile 和 synchronized
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...
资源宝库网站!人人必备的神器!
面对网络中海量的内容,一个高效、便捷的网络导航工具,可以帮助我们快速查找使用网络资源。无论是职场精英还是学生党,使用导航网站都可以帮助我们提升效率。下面小编就来和大家分享一款资源宝库网站-办公人导航-实用的办公生活导航网站&#…...
Redis实战—优惠卷秒杀(锁/事务/代理对象的应用)
本博客为个人学习笔记,学习网站与详细见:黑马程序员Redis入门到实战 P50 - P54 目录 优惠卷秒杀下单功能实现 超卖问题 悲观锁与乐观锁 实现CAS法乐观锁 一人一单功能实现 代码优化 代码细节分析 优惠卷秒杀下单功能实现 Controller层…...
HTML星空特效
目录 写在前面 完整代码 代码分析 运行效果 系列文章 写在后面 写在前面 100行代码实现HTML星空特效。 完整代码 全部代码如下。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&g…...
银行数仓项目实战(四)--了解银行业务(存款)
文章目录 项目准备存款活期定期整存整取零存整取存本取息教育储蓄定活两便通知存款 对公存款对公账户协议存款 利率 项目准备 (贴源层不必写到项目文档,因为没啥操作没啥技术,只是数据。) 可以看到,银行的贴源层并不紧…...
MySQL版本发布模型
MySQL 8.0 之后使用了新的版本控制和发布模型,分为两个主线:长期支持版(LTS)以及创新版。这两种版本都包含了缺陷修复和安全修复,都可以用于生产环境。 下图是 MySQL 的版本发布计划: 长期支持版 MySQL…...
java: 不兼容的类型: org.apache.xmlbeans.XmlObject无法转换为x2006.main.CTRow
我使用的xmlbeans版本是5.0,使用xmlbeans包做转换时,报错,正如标题显示得那样 解决办法 额外再引入下面的jar包 <dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><…...
内容时代:品牌如何利用社交平台精准触达用户
还记得学生时代老师教写作文的时候常说的一句话就是“开头质量决定了阅卷老师想不想花精力去读,而内容质量决定了她愿不愿意给你判高分”这个世界仿若一个巨大的圆,同样的逻辑放在任何地方好像都能适用。在品牌营销中,内容已成为品牌与消费者…...
推荐4款PC端黑科技工具,快来看看,建议收藏
Thunderbird Thunderbird 是由 Mozilla 基金会开发的一款免费且开源的电子邮件客户端,支持 Windows、macOS、Linux 等多种操作系统。它不仅可以用于发送和接收电子邮件,还可以作为新闻阅读器、聊天工具以及日历应用。 Thunderbird 提供了丰富的功能&…...
汉化版PSAI全面测评,探索国产AI绘画软件的创新力量
引言 随着AI技术的飞速发展,图像处理和绘画领域迎来了新的变革。作为一名AIGC测评博主,今天我们测评的是一款国产AI绘画软件——StartAI,一句话总结:它不仅在技术上毫不逊色于国际大牌,更在用户体验和本地化服务上做到…...
LeetCode | 709.转换成小写字母
这道题可以用api也可以自己实现,都不难,大小字母之前相差了32,检查到大写字母时加上32即可 class Solution(object):def toLowerCase(self, s):""":type s: str:rtype: str"""return s.lower()class Solution…...
洗地机哪个品牌比较好?四款好用靠谱的优质洗地机推荐
随着现代生活节奏的加快,家庭清洁成了一项耗时且繁琐的任务。洗地机凭借其智能化和高效的清洁能力,越来越受到大家的青睐。然而,市场上各种品牌和型号琳琅满目,让人眼花缭乱。为了帮助大家在众多选择中找到心仪的产品,…...
java:spring actuator添加自定义endpoint
# 项目代码资源: 可能还在审核中,请等待。。。 https://download.csdn.net/download/chenhz2284/89437274 # 项目代码 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId&…...
LeetCode88-删除有序数组中的重复项
题目 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 代…...
SpringBoot Starter 通用接口加密组件(防篡改)+ RequestBodyAdvice和ResponseBodyAdvice原理
防篡改: 如何保证接口安全,做到防篡改防重放?_接口防止串改-CSDN博客 接口安全设计之防篡改和防重放_接口防篡改机制-CSDN博客 参考博客: RequestBodyAdvice和ResponseBodyAdvice原理详解-CSDN博客 SpringBoot Starter 通用接口…...
delphi 如何使用TEdgeBrowser组件以及打包环境在其他主机上运行
不管开发环境还是第三方环境先安装运行时库:Microsoft Edge WebView2 | Microsoft Edge Developer 开发环境可以直接通过: delphi IDE安装 安装完毕后进入到指定路径,复制里面的WebView2Loader.dll到你要开发的程序根目录: 大致路…...
Sui的Fastcrypto加密库刷新速度记录
Sui使用的加密库Fastcrypto打破了许多速度记录,Mysten Labs在基准测试和安全分析中的工作修复了许多安全漏洞,同时通过识别新的优化技巧为创新开辟了道路。 最近在伦敦帝国理工学院举行的国际性能工程会议(ICPE)基准测试研讨会上…...
Malformed \uxxxx encoding或Maven server structure problem问题解决
问题描述: idea运行项目时, 报错如下: [ERROR] Malformed \uxxxx encoding. [ERROR] Maven server structure problem [ERROR] Malformed \uxxxx encoding. 解决方法总结 先说一下解决方法无非是下面几种 1、先检查项目的.properties、.yml 、pom.xml、logback等…...
Sui主网升级至V1.27.2版本
其他升级要点如下所示: 重点: #17245 增加了一个新的协议版本,并在开发网络上启用了Move枚举。 JSON-RPC #17245: 在返回的JSON-RPC结果中增加了对Move枚举值的支持。 GraphQL #17245: 增加了对Move枚举值和类型的支持。 CLI #179…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
