【高性能服務器】單進程服務器

🔥博客主頁:?我要成為C++領域大神
🎥系列專欄:【C++核心編程】?【計算機網絡】?【Linux編程】?【操作系統】
??感謝大家點贊👍收藏?評論??

本博客致力于知識分享,與更多的人進行學習交流

?

單進程服務器

處理流程:

1、客戶端發送請求

2、服務端處理請求

3、服務端發送響應

4、客戶端接收響應

使用單進程服務器測試業務:

客戶端向標準輸入發送小寫字符串,服務端響應回復對應大寫字符,"abcAS"->"ABCAS"

客戶端向服務端發送關鍵字localtime,服務端響應回復系統時間、

服務端:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <time.h>#define _SERVER_IP "xxx.xxx.xxx.xxx"//這里修改為你服務器的IP地址
#define _PORT 8080
#define _BACKLOG 128
#define _SHUTDOWN 1
#define _TRUE 1
#define _FALSE 0
#define _IPSIZE 16
#define _RECVLEN 1500int main()
{int recvlen;struct sockaddr_in serverAddr,clientAddr;int server_fd;int client_fd;char Result[_RECVLEN];char client_ip[_IPSIZE];socklen_t Addrlen;serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(_PORT);serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);server_fd=socket(AF_INET,SOCK_STREAM,0);bind(server_fd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));listen(server_fd,_BACKLOG);printf("Test TCP Server Version 1.1.0 is Running...\n");time_t tp;char time_buf[100];//存放當前系統時間int toupper_flag;while(_SHUTDOWN){Addrlen=sizeof(clientAddr);if((client_fd=accept(server_fd,(struct sockaddr*)&clientAddr,&Addrlen))>0){//Socket通信bzero(Result,sizeof(Result));bzero(client_ip,sizeof(client_ip));inet_ntop(AF_INET,&clientAddr.sin_addr.s_addr,client_ip,_IPSIZE);printf("Connection From :IP[%s],PORT[%d]\n",client_ip,ntohs(clientAddr.sin_port));sprintf(Result,"Hi [%s] Welcome to my TCP test server!service version 1.1.0...",client_ip);send(client_fd,Result,strlen(Result),0);//讀取用戶數據1,如果用戶發的是普通小寫字符字符串,轉換為大寫,如果發送的是local關鍵字,響應時間bzero(Result,sizeof(Result));//持續響應,循環讀寫while((recvlen=recv(client_fd,Result,sizeof(Result),0))>0){printf("Client Say:%s\n",Result);if(strcmp(Result,"localtime")==0){tp=time(NULL);//獲取時間種子ctime_r(&tp,time_buf);time_buf[strcspn(time_buf,"\n")]='\0';printf("[%s]Response SysTime Successfully!\n",client_ip);send(client_fd,time_buf,strlen(time_buf)+1,0);}else{toupper_flag=0;while(recvlen>toupper_flag){Result[toupper_flag]=toupper(Result[toupper_flag]);++toupper_flag;}printf("[%s]Response Toupper Successfully!\n",client_ip);send(client_fd,Result,recvlen,0);}}close(client_fd);}else{perror("accpet failed");close(server_fd);exit(0);}}close(server_fd);return 0;
}

客戶端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>//客戶端源碼編寫,連接服務器成功,服務器反饋信息#define _IP "xxx.xxx.xxx.xxx"//這里修改為你服務器的IP地址
#define _PORT 8080
int main()
{struct sockaddr_in ServerAddr;bzero(&ServerAddr,sizeof(ServerAddr));ServerAddr.sin_family=AF_INET;ServerAddr.sin_port=htons(_PORT);inet_pton(AF_INET,_IP,&ServerAddr.sin_addr.s_addr);int Myfd=socket(AF_INET,SOCK_STREAM,0);//看需求決定是否要綁定char Response[1024];//存放服務端反饋信息ssize_t recvlen;bzero(Response,sizeof(Response));if((connect(Myfd,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr)))==0){if((recvlen=recv(Myfd,Response,sizeof(Response),0))>0){printf("%s\n",Response);}}else{printf("Connect failed\n");close(Myfd);exit(0);}close(Myfd);printf("Client is Over\n");return 0;
}

完成了大小寫轉換,系統時間的響應:

當再打開一個終端:因為只有一個進程響應客戶端,所以新的客戶端進程被阻塞了。只有上一個進程退出,新的客戶端進程才能連接

缺點:一次只能處理一個客戶端

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37439.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入解析MSE在深度學習回歸中的雙重角色-損失函數-評價指標

深入解析MSE在深度學習回歸中的雙重角色 在深度學習特別是回歸任務中&#xff0c;均方誤差&#xff08;Mean Squared Error, MSE&#xff09;是一種廣泛使用的方法&#xff0c;既可作為損失函數也可作為評價指標。這種使用方式可能會引起一些疑問&#xff1a;作為損失函數和評…

認識100種電路之穩壓電路

在電子電路中&#xff0c;穩壓電路扮演著至關重要的角色。那么&#xff0c;為什么電路需要穩壓&#xff1f;穩壓的原理又是什么&#xff1f;以及穩壓需要用到哪些元器件&#xff0c;數量又有多少呢&#xff1f;今天&#xff0c;就讓我們一同揭開穩壓電路的神秘面紗。 【電路為什…

Apple Final Cut Pro 10.8 - 專業后期制作 (視頻編輯)

Apple Final Cut Pro 10.8 - 專業后期制作 (視頻編輯) Final Cut Pro 10.8 Compressor 4.8 Motion 5.8 (Universal) 請訪問原文鏈接&#xff1a;https://sysin.org/blog/apple-final-cut-pro/&#xff0c;查看最新版。原創作品&#xff0c;轉載請保留出處。 作者主頁&…

供應商關系管理(SRM)中的供應商績效評估

供應商績效評估是供應商關系管理&#xff08;SRM&#xff09;的核心組成部分&#xff0c;它涉及到對供應商在合作過程中的表現進行全面的分析和評價。一個有效的供應商績效評估系統不僅可以幫助企業識別和解決供應鏈中的潛在問題&#xff0c;還可以促進供應商的持續改進和優化&…

7.javaSE基礎進階_設計模式和代理模式(靜態代理JDK和動態代理CGLIB)

文章目錄 一.設計模式1.簡介1)設計模式基本要素2)設計模式的分類1.模式依據其目的可分為&#xff1a;2.第二是范圍準則3.創建模式4.結構模式5、行為模式 2.工廠模式1)定義2)結構3)創建工廠 3.單例(Singleton)模式1)定義2)應用3)分類1.餓漢式EngerSingLeton2.懶漢式LazySingLeto…

Java學習 - Redis緩存問題與優化

緩存收益與成本 收益 加速讀寫降低后端、持久層的負載和壓力 成本 可能導致數據不一致代碼運維成本redis節點運維成本 緩存更新策略 策略一致性維護成本介紹LRU/LIRS算法剔除最差底剔除最近最少使用的數據超時剔除較差底定時刪除、惰性刪除主動更新最好高持久層更新&#x…

監控 Promethus的監控告警Alertmanager、Grafana

Promethus的監控告警Alertmanager Alertmanager 介紹 Prometheus的一個組件&#xff0c;用于定義和發送告警通知&#xff0c;內置多種第三方告警通知方式&#xff0c;同時還提供了對Webhook通知的支持基于警報規則對規則產生的警報進行分組、抑制和路由&#xff0c;并把告警發…

深入了解Spring框架的模塊組成

目錄 Spring CoreSpring ContextSpring AOPSpring DAOSpring ORMSpring WebSpring MVCSpring WebFluxSpring TestSpring BootSpring SecuritySpring BatchSpring IntegrationSpring Cloud結論 Spring Core 1.1 核心容器 Spring Core模塊是整個Spring框架的基礎。它包含了框架…

vue如何引入圖標

方法1&#xff1a;iconify/vue pnpm add iconify/vue -D 網址&#xff1a;https://icon-sets.iconify.design/ 使用哪個需要安裝 如下截圖,安裝指令&#xff1a; > npm install iconify/icons-gg在使用的頁面引入 import { Icon } from “iconify/vue”; <template>…

Mysql存儲過程用法:使用存儲過程編程,來判斷數據庫中數據表中的字段是否重復,避免重復插入記錄

目錄 一、mysql的存儲過程介紹 二、. 創建存儲過程 1、準備 2、創建插入記錄的存儲過程 三. 調用存儲過程 四. 刪除存儲過程 五. 修改存儲過程&#xff0c;避免數據表的姓名出現重復 1、修改存儲過程的方式 2、重新創建存儲過程 六. 驗證新的存儲過程 1、插入新的記…

高考后的抉擇:專業優先還是學校優先?

隨著2024年高考的帷幕落下&#xff0c;高考生們面臨的一個重要抉擇再度浮上心頭&#xff1a;在分數受限的情況下&#xff0c;是選擇一個心儀的專業&#xff0c;還是選擇一個知名度更高的學校&#xff1f;這是一個困擾了眾多考生和家長的長期難題。在這個關鍵的時刻&#xff0c;…

好用的導航網站有哪些

網址導航網站是我們日常上網的一個重要工具。它們不僅可以幫助我們快速找到所需的資源和信息&#xff0c;還能提高我們的工作效率。以下是小編收藏的幾個好用的導航網站&#xff0c;涵蓋了辦公、學習、娛樂等多個領域&#xff0c;分享給大家。 1. 辦公人導航 辦公人導航是一個…

Drag Select Compose:實現多平臺圖片多選功能的利器

Drag Select Compose:實現多平臺圖片多選功能的利器 在現代移動應用開發中,圖片多選功能是一個常見且實用的需求。而實現這種功能可能涉及到復雜的手勢處理和狀態管理。今天,我將介紹一款強大的Compose多平臺庫——Drag Select Compose,它能夠輕松實現類似于Google Photos…

【鴻蒙】第2天?裝飾器?組件和頁面生命周期

背景知識 &#xff11;?ArkTS 拓展了 TypeScript&#xff0c;TypeScript 拓展了 JavaScript。 增加了一些約束。 &#xff12;?ArkTS 是聲明式編程。 構建對象時類似構建者設計模式。鏈式賦值。 裝飾器 &#xff20;Component 自定義組件 Component裝飾器僅能裝飾str…

BGP中的TCP連接源地址問題

3.TCP連接源地址&#xff08;用loop back地址是最優選擇&#xff09; 應用場景與理論&#xff1a; 由于BGP應用于大型網絡中&#xff0c;為了避免單點失敗&#xff0c;往往需要通過多條鏈路連接&#xff0c;當一條鏈路故障時候就用另一條鏈路繼續工作&#xff0c;但是BGP又無法…

為何重要?解析企業實行網絡安全等級保護的必要性

在全球信息化迅速發展的背景下&#xff0c;企業數據資產成為核心競爭力的重要組成部分。然而&#xff0c;隨之而來的網絡安全威脅亦日益嚴峻&#xff0c;從數據泄露到勒索軟件攻擊&#xff0c;每一次安全事件都可能給企業帶來不可估量的損失。在此情境下&#xff0c;實行網絡安…

Java IO: 使用 FileReader 和 FileWriter 進行文件操作

在 Java 中&#xff0c;進行文件操作是一個常見的任務。FileReader 和 FileWriter 是用于讀取和寫入文本文件的類&#xff0c;它們提供了一種方便的方法來處理文件內容。本文將介紹如何使用 FileReader 和 FileWriter&#xff0c;并提供一些示例代碼。 FileReader 類概述 Fil…

使用PHP創建一個簡單的Web爬蟲

隨著互聯網的不斷發展&#xff0c;信息的獲取變得越來越方便。然而&#xff0c;海量的信息也給我們帶來了很多的煩惱&#xff0c;如何高效地獲取到我們所需要的信息就成了一項非常重要的任務。在實現自動化獲取信息的過程中&#xff0c;web爬蟲被廣泛應用。 Web爬蟲是一種自動…

R語言進行字符的替換和刪減gsub,substr函數

目錄 R語言讀文件“-“變成“.“ 提取列字符前幾個 提取列字符末尾幾個 進行字母替換 paste0函數使用</

學計算機的學生假期可以干什么?

學習目標&#xff1a; 學計算機的學生假期可以干什么 學習內容&#xff1a; 實習&#xff1a;尋找計算機相關領域的實習機會&#xff0c;積累工作經驗。這對你未來找工作非常有幫助。在線課程&#xff1a;參加編程、數據科學或其他技術領域的在線課程&#xff0c;提升技能。公…