科林Linux6_網絡

#include<sys/socket.h>
#include<arpa/inet.h>    //大小端轉換
#include<netdb.h>    //DNS

一、Socket套接字

為了開發網絡應用,系統提供一套API函數接口,用于網絡應用開發,這些接口稱為套接字函數

struct sockaddr_int{sin_family=AF_INET;sin_port=8080;sin_addr.s_addr=127.0.0.1;
}addr;

int sockfd=socket(AF_INET,SOCK_STREAM|SOCK_DRAM,0);    //socket創建
//成功返回sockfd,失敗返回-1bind(int sockfd,struct sockaddr* addr/*使用舊的網絡信息結構體,向前兼容*/,socklen_t addrlen);
//成功返回0,失敗返回-1。對socket設置自定義信息,保持信息不變listen(sockfd,backlog/*等待連接隊列大小,默認128*/);//監聽連接過程以及對應的鏈接事件(TCPServer)
//成功返回0,失敗返回-1

htons();    //本機到網絡16位,小端轉大端端口號
htonl();    //小端轉大端p
ntohs();
ntohl();
inet_ntop();    //大端序轉字符串
inet_pton();
inet_addr();
connect(int sockfd,struct sockaddr* destaddr,sockelen_t addrlen);    //請求連接函數(發起握手請求)
//成功返回0,失敗返回-1,如果網絡異常可能引發阻塞int clientsock = accept(int serversocket,struct sockaddr* clientaddr,socklen_t* addrlen);    //阻塞等待并建立連接函數(完成三次握手),連接成功后立即返回
//成功返回sock,失敗返回-1,如果網絡異常可能引發阻塞send(int sockfd,char* msg,int len,MSG_NOSIGNAL/*寫忽略信號*/);    //向目標發送網絡信息recv(int sockfd,char* buffer,int size,MSG_DONTWAIT/*非阻塞讀*/);    //讀取接收網絡信息

TCP連接方式:keep-alive長鏈接,close短鏈接

//TcpServer.h
#include<mysock.h>#define SHUTDOWN 1/*支持 tcp連接 及連接反饋的模型*/int main(){//close 循環持續連接int server_sock,client_sock;struct sockaddr_in addrClient;socklen_t addrlen;server_sock=net_initializer();printf("Test tcp server version 1.0\n");char client_ip[16];while(SHUTDOWN){addrlen=sizeof(addrClient);client_sock=ACCEPT(server_sock,(struct sockaddr*)&addrClient,&addrlen);bzero(client_ip,16);inet_ntop(AF_INET,&addrClient.sin_addr.s_addr,client_ip,16);//大端序轉字符串printf("client port %d,client ip %s\n",ntohs(addrClient.sin_port),client_ip);first_response(client_sock,client_ip);business(client_sock);//讀取請求,處理請求,反饋響應close(client_sock);}close(server_sock);printf("server tis done\n");return 0;
}
//TcpClient.h
#include<mysock.h>int main(){//創建套接字int server_sock=SOCKET(AF_INET,SOCK_STREAM,IPPROTO_TCP);//服務器套接字信息struct sockaddr_in addrServer;bzero(&addrServer,sizeof(addrServer));addrServer.sin_family=AF_INET;addrServer.sin_port=htons(8080);addrServer.sin_addr.s_addr=inet_addr("82.157.31.74");CONNECT(server_sock,(struct sockaddr*)&addrServer,sizeof(addrServer));int nRecvNum=0;int nSendNum=0;char recvBuf[1024]="";char sendBuf[1024]="";nRecvNum=RECV(server_sock,recvBuf,sizeof(recvBuf),0);printf("server:%s\n",recvBuf);fgets(sendBuf,sizeof(sendBuf),stdin);nSendNum=SEND(server_sock,sendBuf,sizeof(sendBuf),0);nRecvNum=RECV(server_sock,recvBuf,sizeof(recvBuf),0);printf("server:%s\n",recvBuf);close(server_sock);return 0;
}

??套接字函數的包裹,網絡功能的包裹:在系統函數的基礎上,拓展函數的功能,在函數的基礎上包裹一層功能更豐富的函數

//myscok.h
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<errno.h>
#include<ctype.h>
#include<time.h>int SOCKET(int domain,int type,int protocol);
int BIND(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
int LISTEN(int sockfd,int backlog);
int CONNECT(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
int ACCEPT(int sockfd,struct sockaddr* addr,socklen_t* addrlen);
ssize_t RECV(int sockfd,void* buf,size_t len,int flags);
ssize_t SEND(int sockfd,const void* buf,size_t len,int flags);int net_initializer();
void first_response(int sock,char* cip);//業務處理模塊
void business(int client_sock);
//mysock.c
#include<mysock.h>int SOCKET(int domain,int type,int protocol){int sock;if((sock=socket(domain,type,protocol))==-1){perror("socket create failed");return -1;}return sock;
}int BIND(int sockfd,const struct sockaddr* addr,socklen_t addrlen){if((bind(sockfd,addr,addrlen))==-1){perror("bind call failed");return -1;}return 0;
}int LISTEN(int sockfd,int backlog){if((listen(sockfd,backlog))==-1){perror("listen call failed");return -1;}return 0;
}int CONNECT(int sockfd,const struct sockaddr* addr,socklen_t addrlen){if((connect(sockfd,addr,addrlen))==-1){perror("connect call failed");return -1;}return 0;
}int ACCEPT(int sockfd,struct sockaddr* addr,socklen_t* addrlen){int sock;if((sock=accept(sockfd,addr,addrlen))==-1){perror("accept call failed");return -1;}return sock;
}ssize_t RECV(int sockfd,void* buf,size_t len,int flags){ssize_t size;if((size=recv(sockfd,buf,len,flags))==-1){if(errno==EAGAIN){printf("recv nonblock return\n");}else{perror("recv call failed");}return -1;}return size;
}ssize_t SEND(int sockfd,const void* buf,size_t len,int flags){ssize_t size;if((size=send(sockfd,buf,len,flags))==-1){perror("send call failed");return -1;}return size;
}int net_initializer(){//套接字信息struct sockaddr_in addrServer;bzero(&addrServer,sizeof(addrServer));addrServer.sin_family=AF_INET;addrServer.sin_port=htons(8080);addrServer.sin_addr.s_addr=htonl(INADDR_ANY);//創建套接字int server_sock;server_sock=SOCKET(AF_INET,SOCK_STREAM,0);BIND(server_sock,(struct sockaddr*)&addrServer,sizeof(addrServer));LISTEN(server_sock,128);return server_sock;
}void first_response(int sock,char* cip){char response[1024];bzero(response,sizeof(response));sprintf(response,"hi, %s wellcome test TCP server.\n",cip);SEND(sock,response,strlen(response),0);
}void business(int client_sock){//讀取一次客戶端請求,處理后,立刻斷開ssize_t recv_size;char recv_buffer[1024];bzero(recv_buffer,sizeof(recv_buffer));recv_size=RECV(client_sock,recv_buffer,sizeof(recv_buffer),0);if((strcmp(recv_buffer,"time\n")==0) || (strcmp(recv_buffer,"time")==0)){//響應系統時間time_t tp;char tbuf[1024];bzero(tbuf,sizeof(tbuf));ctime_r(&tp,tbuf);SEND(client_sock,tbuf,strlen(tbuf),0);printf("server,response time success.\n");close(client_sock);}else{//數據處理,大小寫轉換 toupper()int cnt=0;while(cnt<recv_size){recv_buffer[cnt]=toupper(recv_buffer[cnt]);cnt++;}SEND(client_sock,recv_buffer,recv_size,0);printf("server,response data sucess.\n");close(client_sock);}
}

二、業務

簡易業務:例子

客戶端向服務端發送time關鍵字,服務器接收后,向客戶端返回系統時間

簡單數據處理,客戶端向服務端發送字符串,服務端完成大小寫轉換,并回復

客戶端向服務端發送手機號碼,服務端向手機發送短信,并附帶4位驗證碼,后續的驗證流程忽略

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

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

相關文章

數據庫管理-第194期 網絡加速RDMA初探(20240526)

數據庫管理194期 2024-05-26 數據庫管理-第194期 網絡加速RDMA初探&#xff08;20240526&#xff09;1 概念2 發展3 使用總結 數據庫管理-第194期 網絡加速RDMA初探&#xff08;20240526&#xff09; 作者&#xff1a;胖頭魚的魚缸&#xff08;尹海文&#xff09; Oracle ACE A…

英文 海量的學習句子比單獨的記單詞效果要好,格句致知。

英文 海量的學習句子比單獨的記單詞效果要好 句子有上下文、場景和時態等&#xff0c;能形成劇情&#xff0c;變得生動有趣。 如果一句沒聽懂&#xff0c;還繼續聽就是浪費時間了。要一句一句地深究&#xff0c;不然就要讀好幾遍&#xff0c;還得背誦。要深入理解&#xff0c…

不同的二叉搜索樹(II)題解

toc &#x1f91a;我的博客 歡迎光臨我的博客&#xff1a;https://blog.csdn.net/qq_52434217?typeblog &#x1f95b;前言 動態規劃是常見的算法思路&#xff0c;動態規劃在計算過程中保存了部分計算結果到內存中&#xff0c;以便于在進行下一次計算時可以直接從內存中獲…

Ubuntu部署Dolphinscheduler單機版并配置PG數據庫

1、下載并解壓Dolphinscheduler DolphinScheduler | 下載 (apache.org) 下載完成后得tar.gz包 下載穩定版 下載穩定版 下載穩定版 tar -zxvf apache-dolphinscheduler-3.1.9-alpha-bin.tar.gz mv apache-dolphinscheduler-3.1.9-alpha-bin dolphinscheduler-bin cd dolph…

【Text2SQL】Spider 數據集

論文&#xff1a;Spider: A Large-Scale Human-Labeled Dataset for Complex and Cross-Domain Semantic Parsing and Text-to-SQL Task ????? EMNLP 2018, arXiv:1809.08887 Dataset: spider GitHub: github.com/taoyds/spider 一、論文速讀 本文提出了 Text2SQL 方向的…

1.4 Mac 電腦 Clion 安裝教程

目錄 1 安裝 2 激活 3 漢化 1 安裝 去 https://www.jetbrains.com/clion/download/other.html 下載: 也可以直接到鏈接進行下載:https

嵌入式全棧開發學習筆記---C語言筆試復習大全23

目錄 聯合體 聯合體的定義 聯合體的長度 如果來判斷設備的字節序&#xff1f; 如何把大端數據轉換成小端數據&#xff1f; 枚舉 枚舉的定義 上一篇復習了結構體&#xff0c;這一節復習聯合體和枚舉。 說明&#xff1a;我們學過單片機的一般都是有C語言基礎的了&#xff…

docker鏡像容器搭建nominatim地理編碼服務

1、下載地圖pbf文件: https://planet.openstreetmap.org/ 2、nominatim官網 https://nominatim.org/release-docs/latest/admin/Installation/ 3、地圖文件打包&#xff1a; docker run -it --shm-size20g \ -e PBF_PATH/nominatim/data/china-latest.osm.pbf \ -e REPLIC…

C語言PTA練習題:三角形類別,輸入三角形三條邊,求面積,四則計算器,猴子吃桃

7-1 三角形類別 輸入三個整數&#xff0c;以這三個數為邊長&#xff0c;判斷是否構成三角形&#xff1b;若不能輸出"no"&#xff0c;若構成三角形&#xff0c;進一步判斷它們構的是&#xff1a;銳角三角形或直角三角形或鈍角三角形.分別輸出"ruijiao",&qu…

GitLens或者Git Graph在vscode中對比文件歷史變化,并將歷史變化同步到當前文件中

有時候我們上周改的代碼&#xff0c;現在想反悔把它恢復過來&#xff0c;怎么辦&#xff1f;&#xff1f;&#xff1f;很好&#xff0c;你有這個需求&#xff0c;說明你找對人了&#xff0c;那就是我們需要在vscode中安裝這個插件&#xff1a;GitLens或者Git Graph&#xff0c;…

門禁-jenkins的構建狀態同步到gitlab提交流水線

API接口文檔 https://docs.gitlab.cn/jh/api/commits.html 配置pipline流水線 生成http請求代碼&#xff1a; 使用HttpRequest插件生成 - sharelibs內容 //這是share libs里的 package devopsdef httpReq(reqType, reqUrl, reqBody, accessToken){def gitServer "…

有一個3x4的矩陣,要求用函數編寫程序求出其中值最大的那個元素,以及其所在的行號和列號

常量和變量可以用作函數實參&#xff0c;同樣數組元素也可以作函數實參&#xff0c;其用法與變量相同。數組名也可以作實參和形參&#xff0c;傳遞的是數組的起始地址。 用數組元素作函數實參&#xff1a; 由于實參可以是表達式&#xff0c;而數組元素可以是表達式的組…

Oracle 12C開機自啟動

Oracle 12C設置開機自啟動 1、本文內容 背景說明檢查Oracle當前環境修改配置文件/etc/oratab添加數據庫啟動腳本dbstart 2、背景說明 最近因上線新的兩套系統&#xff0c;增加4套測試環境&#xff0c;由于昨晚機房電路故障&#xff0c;部分物理服務器需要關鍵&#xff0c;電…

2000 年至 2015 年中國(即水稻、小麥和玉米1km 網格)三種主要作物年收獲面積的時空變化

摘要 可靠、連續的主要作物收獲面積信息對于研究地表動態和制定影響農業生產、土地利用和可持續發展的政策至關重要。然而&#xff0c;中國目前還沒有高分辨率的空間明確和時間連續的作物收獲面積信息。全國范圍內主要農作物收獲面積的時空格局也鮮有研究。在本研究中&#xf…

2024年【熔化焊接與熱切割】考試內容及熔化焊接與熱切割考試報名

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 熔化焊接與熱切割考試內容考前必練&#xff01;安全生產模擬考試一點通每個月更新熔化焊接與熱切割考試報名題目及答案&#xff01;多做幾遍&#xff0c;其實通過熔化焊接與熱切割復審模擬考試很簡單。 1、【單選題】…

Django的模型層——2模型實例

1. 類的屬性 objects&#xff1a;是Manager類型的對象&#xff0c;用于與數據庫進行交互 當定義模型類時沒有指定管理器&#xff0c;則Django會為模型類提供一個名為objects的管理器 支持明確指定模型類的管理器 class BookInfo(models.Model):...books models.Manager()當為…

C# 運算符重載的技術深入分析

C# 運算符重載的技術深入分析 一、引言 在C#中&#xff0c;運算符重載是一個允許開發者自定義類或結構中特定運算符行為的特性。通過這個特性&#xff0c;可以為自定義類型創建與內置類型一致的語義&#xff0c;使得代碼更直觀、更易理解。 二、運算符重載基礎 2.1 定義和概…

網絡安全從入門到精通(特別篇I):應急響應之網站入侵排查思路

藍隊應急響應實戰 1. 應急響應-網站入侵-基礎知識2. 應急響應-網站入侵-技能掌握3. 應急響應-網站入侵-案例分析3.1 網站入侵-排查思路-首要任務3.2 IIS&.NET-注入-基于時間配合日志分析3.3 Apache&PHP-漏洞-基于漏洞配合日志分析3.4 Tomcat&JSP-弱口令-基于后門配…

SpringBoot【1】集成 Druid

SpringBoot 集成 Druid 前言創建項目修改 pom.xml 文件添加配置文件開發 java 代碼啟動類 - DruidApplication配置文件-propertiesDruidConfigPropertyDruidMonitorProperty 配置文件-configDruidConfig 控制層DruidController 運行驗證Druid 的監控應用程序 前言 JDK版本&…