server和client之间进行Socket通信,进行数据切片

参考链接

  • send函数和recv函数 – gudako's memo

注意事项

  • 代码很low,主要看封装的Send函数所体现的切片思想即可

server代码

//udp服务端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>
#include <string>
#include <iostream>#define SLICE_SIZE 5bool Send(int sock_fd, char* buffer, int length)
{int once;            //一次发送的返回值int total = 0;        //目前发送了多少数据int thislen = 0;    //本次要发送的数据长度do{if (length - total > SLICE_SIZE)thislen = SLICE_SIZE;elsethislen = length - total;once = send(sock_fd, buffer + total, thislen, 0);if (once <= 0)                        //如果once < 0则表示发送失败,用break跳出循环,返回FALSE{break;}total += once;} while (total < length);                //如果total < length说明数据还未完全发送,继续循环if (total == length)                    //当total == length时,说明已完全发送,返回TRUEreturn true;return false;
}int main(int argc, char const *argv[])
{//1.创建socketint cfd = socket(AF_INET,SOCK_DGRAM,0);if(cfd<0){perror("socket error");return -1;}//绑定struct sockaddr_in serv;struct sockaddr_in client;bzero(&serv,sizeof(serv));serv.sin_family = AF_INET;serv.sin_port = htons(7777);serv.sin_addr.s_addr = htonl(INADDR_ANY);bind(cfd,(struct sockaddr *)&serv,sizeof(serv));//3.循环读取读取客户端消息和给客户端回复消息int i;int n;socklen_t len;char buf[1024];std::string merge;while(1){//4.读取数据memset(buf,0x00,sizeof(buf));len = sizeof(client);n = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&client,&len);merge += buf;printf("serv端口号=[%d]:本次发送字节数=[%d],buf=[%s]\n",ntohs(client.sin_port),n,buf);//        printf("serv端口号=[%d]:本次发送字节数=[%d],bufer=[%s]\n",ntohs(serv.sin_port),once,tmp);std::cout << "merge= " << merge << ";" << "merge size is " << merge.size() <<  std::endl;//5.给客户端回复消息sendto(cfd,buf,n,0,(struct sockaddr*)&client,len);}//关闭套接字close(cfd);return 0;
}

client代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>#define SLICE_SIZE 5char* buffer = {"Helloworld\n"};
char* tmp[1024] ={0};
struct sockaddr_in serv;
bool Send(int sock_fd, char* buffer, int length)
{int once;            //一次发送的返回值int total = 0;        //目前发送了多少数据int thislen = 0;    //本次要发送的数据长度do{if (length - total > SLICE_SIZE)thislen = SLICE_SIZE;elsethislen = length - total;once = send(sock_fd, buffer + total, thislen, 0);
//        printf("serv端口号=[%d]:本次发送字节数=[%d],bufer=[%s]\n",ntohs(serv.sin_port),once,tmp);//        sendto(cfd,buf,n,0,(struct sockaddr*)&serv,sizeof(serv));if (once <= 0)                        //如果once < 0则表示发送失败,用break跳出循环,返回FALSE{break;}total += once;} while (total < length);                //如果total < length说明数据还未完全发送,继续循环if (total == length)                    //当total == length时,说明已完全发送,返回TRUEreturn true;return false;
}int main(){//1.创建socketint cfd = socket(AF_INET,SOCK_DGRAM,0);if(cfd<0){perror("socket error");return -1;}int n ;serv.sin_family = AF_INET;serv.sin_port = htons(7777);inet_pton(AF_INET,"127.0.0.1",&serv.sin_addr.s_addr);struct sockaddr_in client;client.sin_family = AF_INET;client.sin_port = htons(3333);bind(cfd, (struct sockaddr*)&client, sizeof(client));connect(cfd, (struct sockaddr*)&serv, sizeof(serv));char buf[1024] = {'\0'};
//    while(1){//读取标准输入数据
//        memset(buf,0x00,sizeof(buf));
//        n = read(STDIN_FILENO,buf, sizeof(buf));
//        buf[n-1] = 0x00;
//        n -= 1;Send(cfd,buffer, strlen(buffer));//发送数据
//        sendto(cfd,buf,n,0,(struct sockaddr*)&serv,sizeof(serv));//读取数据memset(buf,0x00,sizeof(buf));n = recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
//        printf("[%d]:n=[%d],buf=[%s]\n",ntohs(serv.sin_port),n,buf);
//    }//关闭套接字close(cfd);return 0;
}

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

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

相关文章

天线下倾角示意图_常用天线和无源器件技术参数汇总

原标题&#xff1a;常用天线和无源器件技术参数汇总一、天线原理天线的定义&#xff1a; 能够有效地向空间某特定方向辐射电磁波或能够有效的接收空间某特定方向来的电磁波的装置。天线的功能&#xff1a; 能量转换-导行波和自由空间波的转换; 定向辐射(接收)-具有一定的方向性…

制作作品图片_不懂人文后期制作流程?来,大师手把手教你

制作前1、处理一张照片思路决定步骤 想要了解学习的老师可以私聊小编fzhdyx222制作后2、2020年最新Camera Raw局部影调和色调的控制想要了解学习的老师可以私聊小编fzhdyx222制作前3、2020年最新Camera Raw基础工具细节性运用想要了解学习的老师可以私聊小编fzhdyx222制作后4、…

xlsx文件打开乱码_Excel 2016 双击无法打开xlsx文件怎么办?

最近我重装了系统(Win10Office2016)&#xff0c;然后发现了一个奇怪的bug&#xff1a;双击xlsx文件&#xff0c;只能打开Excel窗口&#xff0c;但是打不开这个文件&#xff0c;有时候再次双击就能打开了&#xff0c;但有时再次双击也不管用&#xff0c;需要在Excel的菜单中点“…

gmssl使用双证书双向认证的gmtl协议报错crypto/sm2/sm2_sign.c 510: sm2_do_verifySSL3 alert write:fatal:decrypt error

报错内容 crypto/sm2/sm2_sign.c 510: sm2_do_verify SSL3 alert write:fatal:decrypt error SSL_accept:error in error ERROR 140655864152064:error:1417B07B:SSL routines:tls_process_cert_verify:bad signature:ssl/statem/statem_srvr.c:2941: 相关内容 版本&#xf…

纠偏的意思_承压能力和纠偏能力,决定成长的高度

承压能力&#xff0c;包含抗压能力、抵御能力&#xff0c;担当能力&#xff0c;分解能力&#xff0c;消化能力&#xff0c;释放能力&#xff0c;等一系列的精神要素&#xff0c;是一个人生存生活工作中一项重要的素质。有的人&#xff0c;承压能力很强&#xff0c;无论经受什么…

《Java8实战》笔记(15):面向对象和函数式编程的混合-Java 8和Scala的比较

面向对象和函数式编程的混合&#xff1a;Java 8和Scala的比较 Scala是一种混合了面向对象和函数式编程的语言。它常常被看作Java的一种替代语言&#xff0c;程序员们希望在运行于JVM上的静态类型语言中使用函数式特性&#xff0c;同时又期望保持Java体验的一致性。和Java比较起…

函数指针作为形参进行调用

代码 两个代码均位于namespace作用域之内addOne将传递进来的形参进行加一&#xff0c;然后返回performance_test函数主要是想简化函数调用&#xff0c;两个形参&#xff0c;第一个表示循环的次数&#xff0c;第二个是带参数的函数指针&#xff0c;函数内部初始化start和end两个…

python中fetchall_Python连接MySQL并使用fetchall()方法过滤特殊字符

来一个简单的例子&#xff0c;看Python如何操作数据库&#xff0c;相比Java的JDBC来说&#xff0c;确实非常简单&#xff0c;省去了很多复杂的重复工作&#xff0c;只关心数据的获取与操作。准备工作需要有相应的环境和模块&#xff1a;Ubuntu 14.04 64bitPython 2.7.6MySQLdb注…

《Java8实战》笔记(16):结论以及Java的未来

结论以及Java的未来 回顾Java8的语言特性 行为参数化&#xff08;Lambda以及方法引用&#xff09; 流 CompletableFuture Optional 默认方法 Java的未来 集合 类型系统的改进 声明位置变量 更多的类型推断 模式匹配 更加丰富的泛型形式 具化泛型 泛型中特别为函…

解决吉大正源(身份认证网关|USBKey)和gmssl(server|client)使用gmtl协议交叉互通报错tlsv1 alert decrypt error

报错内容 SSL_connect:error in SSLv3/TLS write finished140057291788288:error:1409441B:SSL routines:ssl3_read_bytes:tlsv1 alert decrypt error:ssl/record/rec_layer_s3.c:1385:SSL alert number 51 报错原因 gmssl库生成 certificate verify 消息时&#xff0c;对自客…

12无法使用otg_12个冷知识:或许只能看看而无法使用,但却真实存在着

12个或许只能看看而无法使用&#xff0c;但却真实存在着。脸红一所有已知动物中&#xff0c;唯一可以脸红的是人类。二有些地区将雨水归类为公共财物&#xff0c;作为公共财物是不允许收集的&#xff0c;违反者将面临处罚。三世界上汽车研发成本最高的一款车是福特蒙迪欧&#…

《Java8实战》笔记汇总

《Java8实战》笔记&#xff08;01&#xff09;&#xff1a;为什么要关心Java8 《Java8实战》笔记&#xff08;02&#xff09;&#xff1a;通过行为参数传递代码 《Java8实战》笔记&#xff08;03&#xff09;&#xff1a;Lambda表达式 《Java8实战》笔记&#xff08;04&…

三目运算符_C语言知识点:运算符的优先级和结合性

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C语言内置了丰富的运算符&#xff0c;大体可分为10类&#xff1a;算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符和特殊运算符。根据运算符可操作…

可以直接进行运算么_WORD办公技巧:如何直接在WORD中进行加法、乘法运算?

排版目标下图文档中有一张2020年&#xff11;&#xff0d;&#xff13;月口罩购买情况统计表&#xff0c;数据量并不大&#xff0c;我们想不动用excel表格进行统计&#xff0c;直接利用WORD自带的函数公式计算出表格内空白单元格的数值。其中&#xff0c;金额&#xff1d;单价&…

对dladdr未定义的引用

参考链接 c - 为什么我得到“对dladdr的未定义引用”&#xff0c;即使是这个简单程序的-ldl&#xff1f; | 码农俱乐部 - Golang中国 - Go语言中文社区 注意事项 dladdr需要与-ldl链接&#xff0c;且-ldl放置在链接的最后 CMakeLists.txt 模板 cmake_minimum_required(VERSI…

如何优雅互换Map键与值

一般方法 //map must be a bijection in order for this to work properly public static <K,V> HashMap<V,K> reverse(Map<K,V> map) {HashMap<V,K> rev new HashMap<V, K>();for(Map.Entry<K,V> entry : map.entrySet())rev.put(entry…

python程序设计题怎么写_《Python语言程序设计基础》第1章程序练习题

本文为中国大学MOOC《Python语言程序设计》课程学习笔记&#xff0c;课程主讲&#xff1a;嵩天老师&#xff0c;练习平台&#xff1a;Python123&#xff0c;参考教材&#xff1a;《Python语言程序设计基础》1.1 字符串拼接Str1 input("请输入一个人的名字&#xff1a;&qu…

《剑指Offer》36:二叉搜索树与双向链表

题目 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。比如&#xff0c;输入下图中的二叉搜索树&#xff0c;输出转换之后的排序双向链表。 二叉树节点的定义如下&#xff1a; pub…

窗口位置按钮取消_VBA002:“宏”的保存位置有哪几种方式?

商务合作请加微信 | Allen_Lyq文章投稿 | jiangjunpeng1996126.com微信公众号 | Word和Excel达人先生头条号 | 跟小小筱学办公技能通过上一篇文章的学习&#xff0c;我们已经知道宏的基本用法&#xff0c;在录制宏的过程中&#xff0c;还有几个点需要我们注意下&#xff1a;宏命…

《剑指Offer》60:n个骰子的点数

题目 把n个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为S。输入n&#xff0c;打印出S的所有可能的值出现的概率。 分析 直接法 假设骰子有face面&#xff0c;有n个骰子&#xff0c;那么总排列数就有faceⁿ个。&#xff08;例如&#xff0c;有3个6面骰子&#xff…