【網絡服務器】——回聲服務器(echo)

作用

實現回聲服務器的客戶端/服務器程序,客戶端通過網絡連接到服務器,并發送任意一串英文信息,服務器端接收信息后,執行數據處理函數:將每個字符轉換為大寫并回送給客戶端顯示。

客戶端:發送字符信息

服務器端:數據處理函數

效果演示:

服務器端:

客戶端:

過程處理接口:

客戶端:socket()->connect()->write()->read()->close()
服務器端:socket()->bind()->listen()->accept()->read()->write() ->read()->close()

客戶端源代碼(client.c)

分析:

1、生成 句柄fd:SOCK_STREAM(tcp 數據流)SOCK_DGRAM(udp 數據報)

2、連接

3、發送數據(輸入)

4、接收數據(輸出)

5、關閉句柄,釋放資源

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define SERVER_PORT 666
#define SERVER_IP  "127.0.0.1"/*帶參數運行:./echo_client xxxx
*/int main(int argc, char *argv[]){int sockfd;char *message;struct sockaddr_in servaddr;int n;char buf[64];if(argc < 2){fputs("Usage: ./echo_client message \n", stderr);exit(1);}message = argv[1];printf("message: %s\n", message);//1、生成 句柄fd:SOCK_STREAM(tcp 數據流)SOCK_DGRAM(udp 數據報)sockfd = socket(AF_INET, SOCK_STREAM, 0);memset(&servaddr, '\0', sizeof(struct sockaddr_in));//******* 套路 ********servaddr.sin_family = AF_INET;	//協議族:AF_INET(IPv4)inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr);//綁定:IP地址 <--> 套接字socketservaddr.sin_port = htons(SERVER_PORT);	//連接網絡端口、轉換字節序(h:本地 --> ns:網絡net,類型short)//*********************//2、連接connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));//3、發送數據(輸入)write(sockfd, message, strlen(message));//4、接收數據(輸出)n = read(sockfd, buf, sizeof(buf)-1);if(n>0){buf[n]='\0';printf("receive: %s\n", buf);}else {perror("error!!!");}printf("finished.\n");//5、關閉句柄,釋放資源close(sockfd);return 0;
}

服務器端源代碼(server.c)

分析:

1.(socket)創建信箱

2.(bzero)清空標簽,寫上地址和端口號

3.(bind)實現標簽貼到收信得信箱上

4.(listen)把信箱掛置到傳達室,這樣,就可以接收信件了

5.(accept)接收客戶端連接請求

6.(read)讀取客戶端發送的數據

(注:處理函數調用位于這兩步中間)

7.(write)寫入處理后的數據結果

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>#define SERVER_PORT 666int handle(char* buf,int len){for(int i=0; i<len; i++){/*if(buf[i]>='a' && buf[i]<='z'){buf[i] = buf[i] - 32;}*/buf[i] = toupper(buf[i]);}return 1;
}int main(void){int sock;//代表信箱struct sockaddr_in server_addr;//1.美女創建信箱sock = socket(AF_INET, SOCK_STREAM, 0);//2.清空標簽,寫上地址和端口號bzero(&server_addr, sizeof(server_addr));//******* 套路 *******server_addr.sin_family = AF_INET;//選擇協議族IPV4server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//監聽本地所有IP地址server_addr.sin_port = htons(SERVER_PORT);//綁定端口號//********************//3.實現標簽貼到收信得信箱上bind(sock, (struct sockaddr *)&server_addr,  sizeof(server_addr));//4.把信箱掛置到傳達室,這樣,就可以接收信件了listen(sock, 128);//萬事俱備,只等來信printf("等待客戶端的連接\n");int done =1;while(done){struct sockaddr_in client;int client_sock, len, i;char client_ip[64];char buf[256];socklen_t  client_addr_len;client_addr_len = sizeof(client);//5.接收客戶端連接請求client_sock = accept(sock, (struct sockaddr *)&client, &client_addr_len);//打印客服端IP地址和端口號printf("client ip: %s\t port : %d\n",inet_ntop(AF_INET, &client.sin_addr.s_addr,client_ip,sizeof(client_ip)),ntohs(client.sin_port));//6.讀取客戶端發送的數據len = read(client_sock, buf, sizeof(buf)-1);buf[len] = '\0';printf("receive[%d]: %s\n", len, buf);//處理函數:轉換成大寫handle(buf,len);//7.寫入處理后的數據結果len = write(client_sock, buf, len);printf("finished. len: %d\n", len);close(client_sock);}close(sock);return 0;
}

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

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

相關文章

智能學習空間的范式革新:基于AI驅動的自習室系統架構與應用研究

摘要 在 “互聯網 + 教育” 深度融合的背景下,傳統自習室面臨個性化服務缺失、學習效率低下等瓶頸。本文提出一種基于人工智能技術的 AI 自習室系統架構,通過構建多模態數據感知、個性化學習引擎及智能環境調控模塊,實現學習過程的精準化、智能化與沉浸式體驗。研究結合計算…

HTML01:HTML基本結構

HTML基本結構 <html> <head><meta charset"UTF-8"><title>我的第一個網頁</title> </head> <body>我的第一個網頁 </body> </html><body、</body等成對的標簽&#xff0c;分別叫開發標簽和閉合標簽單獨…

Spring Boot 實現多種來源的 Zip 多層目錄打包下載(本地文件HTTP混合)

需要將一批文件&#xff08;可能分布在不同目錄、不同來源&#xff09;打包成Zip格式&#xff0c;按目錄結構導出給用戶下載。 1. 核心思路 支持將本地服務器上的文件&#xff08;如/data/upload/xxx.jpg&#xff09;打包進Zip&#xff0c;保持原有目錄結構。支持通過HTTP下載…

【Elasticsearch】在kibana中能獲取已創建的api keys嗎?

在 Kibana 中&#xff0c;目前沒有直接的界面功能可以列出或查看已創建的 API 密鑰&#xff08;API keys&#xff09;。API 密鑰的管理和查看主要通過 Elasticsearch 的 REST API 來完成&#xff0c;而不是通過 Kibana 的管理界面。 在 Kibana 中使用 Dev Tools 查看 API 密鑰…

公司項目架構搭建者

公司項目架構搭建者分析 項目架構搭建的核心角色 #mermaid-svg-FzOOhBwW3tctx2AR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FzOOhBwW3tctx2AR .error-icon{fill:#552222;}#mermaid-svg-FzOOhBwW3tctx2AR .err…

《技術馴化情感:AI伴侶、監控與倫理框架的重構挑戰》

技術滲透與情感異化機制 情感計算技術正通過多種核心算法和數據處理方法深入人類生活&#xff0c;其在重構人類情感關系的同時也潛藏情感異化風險。本節從生物特征捕捉、行為模式誘導和認知框架重塑三方面解析情感計算的技術機理&#xff0c;并探討其導致的情感依賴現象。 生物…

32單片機——獨立看門狗

1、IWDG的簡介 IWDG&#xff1a;Independent watchdog&#xff0c;即獨立看門狗 獨立看門狗本質上是一個定時器&#xff0c;該定時器是一個12位的遞減計數器&#xff0c;當計數器的值減到0的時候&#xff0c;就會產生一個復位信號 如果在計數沒減到0之前&#xff0c;重置計數器…

[計算機網絡]數據鏈路層

408考綱(數鏈層部分): 0 概論&#xff1a;數據鏈路層都干什么事&#xff0c;提供啥功能 比物理層再高一層就是數據鏈路層&#xff0c;咱們上一篇講物理層&#xff0c;物理層直接接觸傳輸介質&#xff0c;現在數據鏈路層是使用物理層的傳輸服務&#xff0c;然后實現更多的功能。…

OpenAI大變革!繼續與微軟等,以非營利模式沖擊AGI

今天凌晨2點&#xff0c;OpenAI宣布&#xff0c;將繼續由非營利組織控制&#xff1b;現有的營利性實體將轉變為一家公共利益公司&#xff1b;非營利組織將控制該公共利益公司&#xff0c;并成為其重要的持股方。 這也就是說OpenAI曾在去年提到的由非營利性轉變成營利性公司&am…

庫存怎么管?怎樣才能做到有效的庫存管理?

說到庫存管理&#xff0c;估計大多數老板和管理者都有過“煩心事”。一方面&#xff0c;庫存過多&#xff0c;貨物堆積如山&#xff0c;堆在倉庫里也不動&#xff0c;結果占地方還占用資金&#xff1b;另一方面&#xff0c;又有可能遇到客戶急著要貨&#xff0c;可是庫存卻緊張…

Kotlin-空值和空類型

變量除了能引用一個具體的值之外,還有一種特殊的值,那就是 null, 它代表空值, 也就是不引用任何對象 在Kotlin中, 對空值的處理是非常嚴格的,正常情況下,我們的變量是不能直接賦值為 null 的,否則無法編譯通過, 這直接在編譯階段就避免了空指針問題 Kotlin中所有的類型默認都是…

[特殊字符]算法次元突破:螺旋矩陣的“能量解碼術” vs 超立方體的“維度折疊指南”

&#x1f50d; 引言 如果科幻電影中的能量矩陣是算法的考題&#xff0c;你會用螺旋指針破解它的DNA嗎&#xff1f; 如果《星際穿越》的五維空間變成編程題&#xff0c;你敢用動態規劃丈量時間的褶皺嗎&#xff1f; 今天&#xff0c;我們將化身算法世界的能量解…

高光譜相機賦能煙葉分選:精準、高效與智能化的新突破

煙草產業作為中國重要的經濟支柱&#xff0c;煙葉分選的質量與效率直接影響行業效益。傳統人工分選存在效率低、主觀性強、標準難以統一等問題&#xff0c;而機器視覺技術受限于可見光波段&#xff0c;難以捕捉煙葉深層特征。深圳中達瑞和科技有限公司推出的高光譜相機解決方案…

矩陣求導常用公式解析:標量、向量與矩陣的導數計算

矩陣求導常用公式解析&#xff1a;標量、向量與矩陣的導數計算 矩陣求導常用公式解析&#xff1a;標量、向量與矩陣的導數計算矩陣求導的布局問題1. 分子布局 vs 分母布局對比表2. 布局沖突的典型場景分析3. 混合布局的兼容性處理 一、標量對向量求導1. 線性函數求導2. 二次型函…

NocoDB:開源的 Airtable 替代方案

NocoDB:開源的 Airtable 替代方案 什么是 NocoDB?NocoDB 的主要特點豐富的電子表格界面工作流自動化應用商店程序化訪問NocoDB 的應用場景使用 Docker 部署 NocoDB1. 創建數據目錄2. 運行 Docker 容器3. 訪問 NocoDB注意事項總結什么是 NocoDB? NocoDB 是一款功能強大的開源…

全格式文檔轉 Markdown 工具,Docker 一鍵部署,支持 API 調用

以下是簡要介紹&#xff1a; 這是一款可以快速將任意文檔文件轉markdown格式內容的工具&#xff0c;提供API轉換接口&#xff0c;方便集成與應用原理就是利用libreoffice、pandoc文件轉換工具&#xff0c;把所有文檔類型的文件逐步轉化&#xff0c;最終轉成markdown格式的內容…

MATLAB繪制餅圖(二維/三維)

在數據分析與展示領域&#xff0c;餅圖是一種直觀且高效的可視化工具&#xff0c;能夠在瞬間傳遞各部分與整體的比例關系。今天&#xff0c;我將分享一段 MATLAB 繪制二維及三維餅圖的代碼&#xff0c;助你輕松將數據以餅圖形式呈現于眾人眼前。 無論是二維餅圖的簡潔明了&…

AI筆記-1

Halide Perovskites (HPs) 鹵化物鈣鈦礦 鹵化物鈣鈦礦&#xff08;HPs&#xff09;已被 公認為 光伏和發光器件 中最有前途的材料之一 在本觀點中&#xff0c;我們將探討鈣鈦礦的定義&#xff0c;主要聚焦于由 較重鹵素&#xff08;Cl、Br和I&#xff09;組成的鈣鈦礦亞群&…

excel表數據導入數據庫

前兩天&#xff0c;有個兩DB之間的數據導出導入的需求。對方提供的是excel表&#xff0c;我這邊是mysql數據庫&#xff0c;excel表第一行是字段名&#xff0c;之后的行是記錄的值。 其實沒有多復雜&#xff0c;我先將exel轉成csv&#xff0c;結果mysql導入csv&#xff0c;第一行…

智能機器人在物流行業的應用:效率提升與未來展望

隨著全球電子商務的蓬勃發展&#xff0c;物流行業正面臨著前所未有的挑戰和機遇。傳統的物流模式已經難以滿足日益增長的市場需求&#xff0c;尤其是在效率、成本控制和精準配送方面。智能機器人技術的出現&#xff0c;為物流行業的轉型升級提供了強大的動力。本文將探討智能機…