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.pswp.cn/news/445875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445875.shtml
英文地址,請注明出處:http://en.pswp.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…