網絡編程;套接字;TCP通訊;UDP通訊;0909

思維導圖

TCP服務器端和客戶端通訊

服務器端 代碼

#include<myhead.h>
#define SER_IP "192.168.109.12"//我的虛擬機的ip
#define SER_PORT 8888
int main()
{//1.創建一個用于連接的套接字文件描述符int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}printf("sfd = %d\n",sfd);//2.給套接字綁定ip地址和的端口號//2.1準備地址信息結構體struct sockaddr_in sin;//通信域地址族sin.sin_family = AF_INET;//服務器端口號sin.sin_port = htons(SER_PORT);//2字節 主機字節序 轉化為 網絡字節序//服務器ip地址sin.sin_addr.s_addr = inet_addr(SER_IP);//ip地址 點分十進制 轉化為 網絡字節序//2.2執行綁定工作if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success\n");//3.將套接字設置成被動監聽狀態if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//4.阻塞 等客戶端的連接//4.1 定義地址信息結構體,用于客戶端地址信息struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);//接收地址長度int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd==-1){perror("accept error");return -1;}printf("[%s:%d]-連接成功newfd = %d\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),newfd);//5.實現數據的收發char buf[128]="";while(1){//清空bufbzero(buf,sizeof(buf));//從套接字讀取消息int res=read(newfd,buf,sizeof(buf));if(res==0){printf("客戶端下線\n");close(newfd);//關閉通信套接字break;}printf("[%s:%d] : %s\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),buf);//給消息 加個:D還回去strcat(buf,":D");write(newfd,buf,strlen(buf));printf("發送成功\n");}//6.關閉套接字close(sfd);return 0;
}

客戶端 代碼

#include<myhead.h>
#define SER_IP "192.168.109.12"    //服務器ip地址
#define SER_PORT 8888               //服務器端口號
#define CLI_IP "192.168.109.12"     //客戶端ip地址
#define CLI_PORT 7777               //客戶端端口號int main(int argc, const char *argv[])
{//1、創建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、給客戶端套接字綁定ip地址和端口號//2.1 填充地址信息結構體struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_addr.s_addr = inet_addr(CLI_IP);cin.sin_port = htons(CLI_PORT);//2.2 綁定if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin))==-1){perror("bind error");return -1;}//3、連接服務器//3.1 組裝對端地址信息結構體struct sockaddr_in sin;sin.sin_family = AF_INET;    //通信域sin.sin_addr.s_addr = inet_addr(SER_IP);   //要連接的服務器ipsin.sin_port = htons(SER_PORT);     //服務器的端口號//3.2 連接操作if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("connect error");return -1;}//4、數據通信char buf[128] = "";while(1){//從終端輸入要發送的消息fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//判斷輸入內容if(strcmp(buf, "quit")==0){break;}//將消息發送給服務器write(cfd, buf, strlen(buf));printf("發送成功\n");//接受服務器發來的消息bzero(buf, sizeof(buf));int res = read(cfd, buf, sizeof(buf));if(res == 0){printf("服務器已經下線\n");break;}printf("收到服務器消息:%s\n", buf);}//5、關閉套接字close(cfd);return 0;
}

運行

UDP服務器和客戶端通訊

服務器代碼

#include<myhead.h>
#define SER_IP "192.168.109.12"
#define SER_PORT 8888/*****************主程序*****************/
int main(int argc, const char *argv[])
{//1、創建一個用于通信的套接字文件描述符int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、綁定ip地址和端口號(必須)//2.1 封裝結構體struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_addr.s_addr = inet_addr(SER_IP);sin.sin_port = htons(SER_PORT);//2.2 綁定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("bind error");return -1;}//3、數據收發char buf[128] = "";      //用于接受對端消息//定義一個地址信息結構體的變量,用于接收對端地址struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);   //接受地址長度while(1){//清空容器bzero(buf, sizeof(buf));//從套接字文件描述符中讀取消息recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen);printf("[%s:%d] : %s\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);//給消息加個笑臉還回去strcat(buf, ":D");//發送消息sendto(sfd, buf, strlen(buf), 0, (struct sockaddr*)&cin, sizeof(cin));printf("發送成功\n");}//4、關閉套接字close(sfd);return 0;
}                            

客戶端代碼

#include<myhead.h>#define SER_IP "192.168.109.12"
#define SER_PORT 8888/******************主程序******************/
int main(int argc, const char *argv[])
{//1、創建一個用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、綁定ip和端口號(可選)//3、數據收發char buf[128] = "";    //數據容器struct sockaddr_in sin;     //目標地址sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);socklen_t addrlen = sizeof(sin);while(1){//清空容器bzero(buf, sizeof(buf));fgets(buf, sizeof(buf), stdin);   //從終端獲取數據buf[strlen(buf)-1] = 0;if(strcmp(buf,"quit")==0){break;}//將數據發送給服務器sendto(cfd, buf, strlen(buf), 0, (struct sockaddr*)&sin, sizeof(sin));printf("發送成功\n");//接收服務器發來的消息bzero(buf, sizeof(buf));//recvfrom(cfd, buf, sizeof(buf), 0, (struct socket*)&sin, &addrlen);//recvfrom(cfd, buf, sizeof(buf), 0, NULL,NULL);read(cfd, buf, sizeof(buf));printf("收到服務器消息為:%s\n", buf);}//4、關閉套接字close(cfd);return 0;
}

運行情況

牛客

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

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

相關文章

貪心算法應用:柔性制造系統(FMS)刀具分配問題詳解

Java中的貪心算法應用&#xff1a;柔性制造系統(FMS)刀具分配問題詳解 1. 問題背景與定義 柔性制造系統(Flexible Manufacturing System, FMS)是現代智能制造中的關鍵組成部分&#xff0c;它能夠靈活地適應不同產品的生產需求。在FMS中&#xff0c;刀具分配是一個核心優化問題&…

不止是DELETE:MySQL多表關聯刪除的JOIN語法實戰詳解

MySQL 的 ??DELETE?? 語句用于從數據庫表中刪除記錄。這是一項非常強大且危險的操作&#xff0c;因為一旦執行&#xff0c;數據通常無法恢復。理解其語法和安全實踐至關重要。以下是 MySQL 刪除語句的詳細指南。一、 核心語法&#xff1a;DELETE??DELETE?? 語句用于刪除…

ubuntu 系統使用過程中黑屏問題分析

背景&#xff1a; 工欲善其事&#xff0c;必先利其器。作為程序員&#xff0c;想要得到更好的發展&#xff0c;遇到問題直接baidu, google 雖然可以得到一些參考或者答案&#xff0c;但是也會降低自己的思考能力&#xff0c;本文以ubuntu 使用過程中黑屏這一問題為背景&#x…

Redis(45)哨兵模式與集群模式有何區別?

Redis 提供了兩種高可用性解決方案&#xff1a;哨兵模式和集群模式。它們各自有不同的特點和適用場景。以下是詳細的對比和結合代碼的示例&#xff1a; 哨兵模式&#xff08;Sentinel&#xff09; 特點高可用性&#xff1a; Sentinel 通過監控、通知、故障轉移等功能&#xff0…

微信小程序如何進行分包處理?

目錄 分包是什么&#xff1f; 為什么要分包&#xff1f; 分包前后結構對比 具體操作步驟 第 1 步&#xff1a;規劃分包結構 第 2 步&#xff1a;修改 app.json 進行配置 第 3 步&#xff1a;創建分包目錄并移動文件 第 4 步&#xff1a;處理組件和工具函數的引用 第 5…

Go語言極速入門與精要指南從零到精通的系統化學習路徑

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

git 切換倉庫后清理分支緩存

我明白了&#xff0c;從您的截圖可以看到遠程倉庫中有 feature/v1.4_20250903 分支&#xff0c;但本地 git branch -r 看不到&#xff0c;這是因為之前更換過倉庫地址后需要重新獲取遠程倉庫的所有信息。讓我們執行以下步驟來解決這個問題&#xff1a; 首先執行 git fetch --al…

考研倒計時101天---路由選擇協議

路由選擇協議&#xff1a;RIP 與 OSPFRIP 協議&#xff08;基于距離向量算法&#xff09;RIP&#xff08;Routing Information Protocol&#xff09;是一種內部網關協議&#xff08;IGP&#xff09;&#xff0c;采用距離向量算法進行路由選擇。其主要特點如下&#xff1a;工作機…

「類 vs 實例」對比 ,「類 - 原型 - 實例」的關系

堅持的本身就是意義 目錄直觀類比類 (Class) vs 實例 (Instance)對比表示例代碼類 - 原型 - 實例關系圖解釋&#xff1a;類 (class Person)原型 (Person.prototype)實例 (new Person(...))總結&#xff1a;直觀類比 類&#xff08;Class&#xff09; 圖紙 / 模板實例&#xf…

第一課、Cocos Creator 3.8 安裝與配置

介紹說明 本文主要介紹在windows系統中&#xff0c;安裝開發Cocos使用的軟件工具&#xff0c;主要包含&#xff1a;安裝CocosDashboard控制面板、CocosCreator3.8編輯器和腳本編輯器 VS Code 。 一、Cocos Dashboard 的安裝 說明&#xff1a;Cocos Dashboard 主要作用是能夠同…

從航空FACE的一個落地方案漫談汽車HPC軟件架構的思維轉變(2/3)FACE的“段”同Autosar的“層”概念區別探索

文章目錄PART THREE&#xff1a;段和層的概念比較一、“段”更強調“功能閉環責任歸屬”&#xff0c;而非“單純的層級堆疊”二、“段”規避“層”的“剛性依賴陷阱”&#xff0c;適配航空系統的“靈活組合需求”三、“段”貼合航空工業的“工程化語言習慣”&#xff0c;降低跨…

金融量化指標--6InformationRatio信息比率

InformationRatio信息比率計算公式添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09;一、信息比率&#xff08;IR&#xff09;是什么&#xff1f;核心概念&#xff1a;信息比率衡量的是投資組合經理相對于某個基準指數&#xff08;Benchmark&#xff09;&…

Java全棧開發面試實錄:從基礎到微服務的實戰經驗分享

Java全棧開發面試實錄&#xff1a;從基礎到微服務的實戰經驗分享 一、初識面試場景 我叫李明&#xff0c;28歲&#xff0c;畢業于復旦大學計算機科學與技術專業&#xff0c;碩士學歷。在互聯網行業已經有5年的工作經驗&#xff0c;先后在兩家中型互聯網公司擔任Java全棧開發工程…

【51單片機】【protues仿真】基于51單片機公交報站系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 主要功能如下&#xff1a; 1、LCD12864顯示時間、日期、公交車車站、溫度等 2、按鍵設置時間&#xff0c;顯示公交車信息 3、串口播報相應站點信息 4、按鍵控制上行、下行、手動播…

第1節-PostgreSQL入門-從表中查詢數據

摘要&#xff1a;在本教程中,你將學習如何使用 PostgreSQL 的 SELECT 語句從表中檢索數據。 SELECT 語句 要從表中查詢數據,需使用 PostgreSQL 的 SELECT 語句。 以下是 SELECT 語句的基本語法: SELECT column1, column2, ... FROM table_name;在這種語法中: 首先,在 SELECT 關…

【C++進階】---- map和set的使用

1.序列式容器和關聯式容器 前?我們已經接觸過STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;這些容器統稱為序列式容器&#xff0c;因為邏輯結構為線性序列的數據結構&#xff0c;兩個位置存儲的值之間?般沒有緊密的關聯關系…

430章:Python Web爬蟲入門:使用Requests和BeautifulSoup

在軟件交付日益高頻、用戶需求快速迭代的今天&#xff0c;版本發布流程的規范性直接決定了團隊的交付效率、產品質量和用戶滿意度。然而&#xff0c;許多團隊仍面臨以下痛點&#xff1a;發布混亂&#xff1a;分支管理隨意&#xff0c;代碼沖突頻發&#xff1b;質量失控&#xf…

代碼隨想錄第七天|● 454.四數相加II ● 383. 贖金信 ● 15. 三數之和 18.四數之和

本文所有題目鏈接/文章講解/視頻講解&#xff1a;https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html 454.四數相加II 有四個數組&#xff0c;如果要遍歷則時間復雜度太大 可以選擇分組&#xff0c;a和b一組&#xff0c;c和d一組 這樣就可以等同于…

Vue3源碼reactivity響應式篇之computed計算屬性

概述 vue3中&#xff0c;computed函數用于表示計算屬性&#xff0c;有惰性求值、響應式追蹤依賴的特點。本文將介紹computed的實現原理以及其機制細節。 源碼解析 computed計算屬性和computed方法、ComputedRefImpl類以及refreshComputed方法有關。 computed方法 computed暴露給…

[嵌入式embed]Keil5燒錄后STM32不自動運行,復位才能運行

[嵌入式embed]Keil5燒錄后STM32不自動運行,復位才能運行Keil5-驗證“Reset and Run”功能是否生效參考文章Keil5-驗證“Reset and Run”功能是否生效 參考文章 Keil5燒錄后STM32不自動運行&#xff1f;必須復位才能啟動的終極解決方案