網絡編程第二天

1.基于TCP的通信(面向連接的通信)

服務器代碼實現:

#include <myhead.h>
#define IP "192.168.126.91"
#define PORT 9999
int main(int argc, const char *argv[])
{//1、創建套接字int sfd=-1;if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//2、綁定//將服務器的地址信息結構體綁定到sfd文件描述符中struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}//設置監聽if(listen(sfd,128)==-1){perror("listen error");return -1;}//accept連接//創建連接之后的客戶端地址信息結構體struct sockaddr_in cin;socklen_t socklen=sizeof(cin);int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);if(newfd==-1){perror("accept error");return -1;}printf("[%s:%d]連接成功\n",inet_ntoa(cin.sin_addr)\,ntohs(cin.sin_port));//進行數據的收發char rbuf[128]="";while(1){//接收客戶端的消息bzero(rbuf,sizeof(rbuf));int res=recv(newfd,rbuf,sizeof(rbuf),0);if(res==0||strcmp(rbuf,"quit")==0){printf("客戶端下線\n");break;}printf("[%s:%d]:發送的消息為%s\n",inet_ntoa(cin.sin_addr)\,ntohs(cin.sin_port),rbuf);//發送消息到客戶端strcat(rbuf,"*_*");send(newfd,rbuf,sizeof(rbuf),0);}//關閉文件描述符close(sfd);close(newfd);return 0;
}

客戶端的代碼實現:

#include <myhead.h>
#define IP "192.168.126.91"
#define PORT 9999
int main(int argc, const char *argv[])
{int cfd=-1;if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}//連接服務器struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(PORT);cin.sin_addr.s_addr=inet_addr(IP);if(connect(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("connect error");return -1;}char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));printf("請輸入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;send(cfd,wbuf,strlen(wbuf),0);if(strcmp("quit",wbuf)==0){printf("客戶端下線\n");break;}//接收的數據bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到的消息是:%s\n",wbuf);}return 0;
}

運行結果:

2.基于UDP的通信(面向無連接的通信)

服務器端代碼實現:

#include <myhead.h>
#define PORT 3333
#define IP "192.168.126.91"
int main(int argc, const char *argv[])
{//創建套接字int sfd=-1;if((sfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//綁定端口號和ipstruct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}//創建對端地址信息結構體struct sockaddr_in cin;socklen_t socklen=sizeof(cin);char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));if(recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&socklen)==-1){perror("recvfrom error");return -1;}if(strcmp(rbuf,"quit")==0){printf("客戶端下線\n");break;}printf("收到的消息是:%s\n",rbuf);//給客戶端回一個消息//bzero(rbuf,sizeof(rbuf));strcat(rbuf,"*_*");if(sendto(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,socklen)==-1){perror("sendto error");return -1;}	}close(sfd);return 0;
}

客戶端代碼實現:

#include <myhead.h>
#define PORT 3333
#define IP "192.168.126.91"
int main(int argc, const char *argv[])
{//創建套接字int cfd=-1;if((cfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//創建對端地址信息結構體struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(PORT);cin.sin_addr.s_addr=inet_addr(IP);socklen_t socklen=sizeof(cin);char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));printf("請輸入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;if(sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&cin,socklen)==-1){perror("sendto error");return -1;}if(strcmp(wbuf,"quit")==0){printf("客戶端下線\n");break;}bzero(wbuf,sizeof(wbuf));if(recvfrom(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&cin,&socklen)==-1){perror("recvfrom error");return -1;}printf("收到服務器的消息為%s\n",wbuf);}close(cfd);return 0;
}

運行結果:

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

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

相關文章

LeetCode 76 最小覆蓋字串

LeetCode 76 最小覆蓋字串 在本篇博客中&#xff0c;我們將探討LeetCode上的一道算法題目——“最小覆蓋子串”。這道題的主要目標是找到字符串s中包含字符串t中所有字符的最小子串。 問題描述 給定字符串s和t&#xff0c;要求在字符串s中找到一個最小的子串&#xff0c;使得…

5.36 BCC工具之ucalls.py解讀

一,工具簡介 ucalls工具總結了包括Java、Perl、PHP、Python、Ruby、Tcl和Linux系統調用在內的各種高級語言中的方法調用。它顯示最常調用方法的統計信息,以及這些方法的延遲(持續時間)。 通過系統調用支持,ucalls可以提供關于進程與系統交互的基本信息,包括系統調用計數…

ES系列之Logstash實戰入門

概述 作為ELK技術棧一員&#xff0c;Logstash用于將數據采集到ES&#xff0c;通過簡單配置就能把各種外部數據采集到索引中進行保存&#xff0c;可提高數據采集的效率。 原理 數據源提供的數據進入Logstash的管道后需要經過3個階段&#xff1a; input&#xff1a;負責抽取數…

C#單向鏈表實現:在當前節點后插入新數據的方法Insert()

目錄 一、涉及到的知識點 1.插入算法 2.示例中current 和 _current 的作用 3.current 和 _current 能否合并為一個變量 4.單向鏈表節點類的三個屬性 &#xff08;1&#xff09;Next屬性&#xff1a; &#xff08;2&#xff09; Value屬性&#xff1a; &#xff08;3&am…

【ArcPy】批量讀取文件夾excel中XY并轉為點shp

示例展示 代碼 只讀取excel中含有XY字段的文件&#xff0c;并將矢量命名為excel文件名稱。 import os import pandas as pd import arcpy folder_path r"C:\Users\admin\Desktop\excelfile" extension"xlsx" files [file for file in os.listdir(folder…

SpringCloud gateway限流無效,redis版本低的問題

在使用springCloud gateway的限流功能的時候&#xff0c;配置RedisRateLimiter限流無效&#xff0c;后來發現是Redis版本過低導致的問題&#xff0c;實測 Redis版本為3.0.504時限流無效&#xff0c;改用7.0.x版本的Redis后限流生效。查了資料發現很多人都遇見過這個問題&#x…

RedisTemplate 序列化成功,反序列化失敗List, Set, Map失敗

RedisTemplate 序列化成功&#xff0c;反序列化失敗List, Set, Map失敗 異常信息RedisTemplate配置異常原因錯誤代碼示例解決方法 序列化成功&#xff0c;反序列化失敗 異常信息 Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve ty…

小程序事件處理

事件處理 一個應用僅僅只有界面展示是不夠的&#xff0c;還需要和用戶做交互&#xff0c;例如&#xff1a;響應用戶的點擊、獲取用戶輸入的值等等&#xff0c;在小程序里邊&#xff0c;我們就通過編寫 JS 腳本文件來處理用戶的操作 1. 事件綁定和事件對象 小程序中綁定事件與…

React之組件定義和事件處理

一、組件的分類 在react中&#xff0c;組件分為函數組件和class組件&#xff0c;也就是無狀態組件和有狀態組件。 * 更過時候我們應該區別使用無狀態組件&#xff0c;因為如果有狀態組件會觸發生命周期所對應的一些函數 * 一旦觸發他生命周期的函數&#xff0c;它就會影響當前項…

如何設置從小程序跳轉到其它小程序

?有的商家有多個小程序&#xff0c;希望能夠通過一個小程序鏈接到所有其它小程序&#xff0c;用戶可以通過點擊跳轉鏈接實現從一個小程序跳轉到另一個小程序。要怎么才能實現這樣的跳轉呢。下面具體介紹。 1. 設置跳轉。在小程序管理員后臺->分類管理&#xff0c;添加一個…

ssm個人學習01

Spring配置文件: spring環境的搭建: 1:導入對應的spring坐標 也就是依賴 2:編寫controller, service, dao相關的代碼 3:創建配置文件(在resource下面配置文件) 例如:applicationContext.xml <bean id "" class ""> <property name "&…

Node.js 中 fs 模塊文件操作的應用教程

Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境&#xff0c;它可以讓 JavaScript 代碼在服務器端運行。在 Node.js 中&#xff0c;fs 模塊是用來處理文件系統操作的模塊。通過 fs 模塊&#xff0c;我們可以進行文件的讀取、寫入、刪除等操作。本教程將介紹如何在 No…

工作電壓范圍寬的國產音頻限幅器D2761用于藍牙音箱,輸出噪聲最大僅-90dBV

近年來隨著相關技術的不斷提升&#xff0c;音箱也逐漸從傳統的音箱向智能音箱、無線音箱升級。同時在消費升級的背景下&#xff0c;智能音箱成為人們提升生活品質的方式之一。智能音箱是智能化和語音交互技術的產物&#xff0c;具有點歌、購物、控制智能家居設備等功能&#xf…

python水表識別圖像識別深度學習 CNN

python水表識別&#xff0c;圖像識別深度學習 CNN&#xff0c;Opencv,Keras 重點&#xff1a;項目和文檔是本人近期原創所作&#xff01;程序可以將水表圖片里面的數據進行深度學習&#xff0c;提取相關信息訓練&#xff0c;lw1.3萬字重復15%&#xff0c;可以直接上交那種&…

Vue中<style scoped lang=“scss“>的含義

這段代碼中的<style scoped lang"scss">是HTML和Vue框架結合使用時常見的一個模式&#xff0c;具體含義如下&#xff1a; scoped&#xff1a;這是一個Vue.js特有的屬性&#xff0c;用來指定樣式只應用于當前組件的元素。沒有這個屬性時&#xff0c;樣式會全局應…

python給企微發消息

方法一&#xff1a;webhook方式。使用群機器人給企微群發消息 import requestsdef qwxsendmessage(msg):urlhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6c598840-804a-4eb5-a999-a023313 #url換成自己群機器人的webhookurldata{msgtype:text,text:{content:msg}}…

elasticsearch7.17 terms聚合性能提升90%+

背景 ES7 相比于 ES6 有多個層面的優化&#xff0c;對于開源的ES而言&#xff0c;升級是必經之路。 ES的使用場景非常多&#xff0c;在升級過程中可能會遇到非預期的結果&#xff1b; 比如之前文章提到的典型案例&#xff1a;ES7.17版本terms查詢性能問題 ES7.17版本terms查…

【Python筆記-FastAPI】后臺任務+WebSocket監控進度

目錄 一、代碼示例 二、執行說明 (一) 調用任務執行接口 (二) 監控任務進度 實現功能&#xff1a; 注冊后臺任務&#xff08;如&#xff1a;郵件發送、文件處理等異步場景&#xff0c;不影響接口返回&#xff09;監控后臺任務執行進度&#xff08;進度條功能&#xff09;支…

常見的幾種httpclient

工作是spring 項目一般都是使用ResTemplate 但是還是有些項目中會用到httpClient&#xff0c;沒有毛用。 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> …

pclpy 點云法線

pclpy 點云法線 一、算法原理1.理論入門2.選擇正確的比例 二、代碼三、結果四、相關數據 一、算法原理 表面法線是幾何表面的重要屬性&#xff0c;在許多領域&#xff08;例如計算機圖形應用程序&#xff09;中大量使用&#xff0c;以應用正確的光源來生成陰影和其他視覺效果。…