套介面socket編程基礎

来源:https://www.cnblogs.com/wy9264/archive/2019/03/05/10478353.html
-Advertisement-
Play Games

基本概念 套介面也就是網路中的ID。網路通信,歸根到底還是進程間通信(不同電腦上的進程間的通信)。在網路中,每一個節點(電腦或路由器)都有一個網路地址,也就是IP地址。 IP地址:在網路中唯一標識一臺主機 埠號:在主機中唯一標識一個進程 IP+port:在網路環境中唯一標識一個進程(socke ...


基本概念                                                                                                                                         

套介面也就是網路中的ID。網路通信,歸根到底還是進程間通信(不同電腦上的進程間的通信)。在網路中,每一個節點(電腦或路由器)都有一個網路地址,也就是IP地址。

  • IP地址:在網路中唯一標識一臺主機,32
  • 埠號:在主機中唯一標識一個進程,16
  • IP+port:在網路環境中唯一標識一個進程(socket)

      socket也稱套接字,是linux文件的一種類型(偽文件:不占存儲空間的文件。linux 有7中文件, 1.普通文件  2.目錄(d)3.字元設備文件(c) 4.塊設備文件(b) 5.套介面文件(s)[如我們開啟MySQL服務後,在/var/lib/mysql/下生成的mysql.sock文件,關閉MySQL服務後,這個文件就消失了],6.管道(p):有兩端,讀端 r:流出 fd[0]     寫段w:流入 fd[1]         7.符號鏈接文件(l)[有點兒像WIN下的快捷方式]  其中占存儲的有三種:普通,目錄,軟鏈接)

       socket成對出現,

       一個文件描述符指向兩個緩衝區,一個讀一個寫。

預備知識                                                                                                                                          、

網路位元組序:

       TCP/IP規定,網路數據流應採用大端位元組序,即低地址高位元組。(大端:低地址--高位   高地址--地位    小端:低--低 高--高,即埠號和IP地址都是以網路位元組序存儲的,網路位元組序使用的是大端模式。稱給某個系統所採用的位元組序為主機位元組序,它可能是小端模式也可能是大端模式。

       為使網路編程具有可移植性,使同樣的C代碼在大端和小端電腦上編譯後能正常運行,可以調用一下庫函數做網路位元組序和主機位元組序的轉換。

#include<arpa/inet.h>
uint32_t  htoal(uint32_t hostlong);
uint16_t  htons(uint16_t hostshort);
//返回的是網路位元組序
uint32_t ntoh1(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
//返回的主機位元組序
//h表示host,to,n代表network,s代表short,l表示long
//埠16位 ,ip 32位

 套介面的數據結構                                                                                                                                

      在Linux中,每一種協議都有自己的網路地址數據結構,以sockaddr_開頭,如IPV4對應的是sockaddr_in.

           //man 7 ip 查看

           struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
            /*套介面結構地址族,如IPV4為AF_INET*/
               in_port_t      sin_port;   /* port in network byte order */
            /*16位TCP或UDP埠號,網路位元組順序*/
               struct in_addr sin_addr;   /* internet address */
           };

           /* Internet address. */
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };

C/S編程                                                                                                                                                  

伺服器是指在網路上提供服務的應用程式,客戶機是指用戶為了得到某種服務所需要 運行的應用程式,即申請服務的程式。一個伺服器程式可以同時接收多個客戶機的請求。

 

server.c:
socket() 建立套接字
bind()  綁定IP 埠號(struct sockaddr_in addr 初始化)
listen() 指定最大同時發起連接數
accept()  阻塞等待客戶端發起連接
read()
小--大
write 給客戶端
close();

 

client.c:
socket();
bind();可以依賴“隱式綁定”,即寫不寫都行
connect();發起連接
write();
read();
close();

 

//server編程
#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<ctype.h>
#define SERV_PORT 6666 //埠號
int main(void)
{
   int lfd,cfd;//定義套介面描述符
   struct sockaddr_in serv_addr;//定義伺服器IPV4套介面地址數據結構serv_addr
   struct sockaddr_in clie_addr;//d定義客戶端client
   socklen_t clie_addr_len;
   char buf[BUFSIZ];//用BUFSIZ就不需要自己定義巨集了
   int i,n;
   lfd=socket(AF_INET,SOCK_STREAM,0);//AF_INET:IPV4 AF_INET6:IPV6
  
   serv_addr.sin_family=AF_INET;//設置addr的成員信息
   serv_addr.sin_port=htons(SERV_PORT);//本地位元組序轉換為網路位元組序
   serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);//IP地址設為本地IP INADDR_ANY本地任意IP
  
   bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));//綁定埠
   
   listen(lfd,128);//最多可以接受128個客戶端的請求,監聽ifd描述符
   
   clie_addr_len=sizeof(clie_addr);
   cfd=accept(lfd,(struct sockaddr *)&clie_addr,&clie_addr_len);//bind accept connect 需要強轉
   
    n= read(cfd,buf,sizeof(buf));
   for(i=0;i<n;i++)
   {   
     buf[i]=toupper(buf[i]);//下寫轉換為大寫
   }   
   write(lfd,buf,n);
   close(lfd);
   close(cfd);

   return 0;

}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /// /// 反射獲取所有DisplayName標記值 /// /// 實體類型 /// 需要獲取的實體 /// List GetDisplayName(T model) { //獲取所有屬性 PropertyInfo[] pr... ...
  • cobbler簡介 Cobbler是一個Linux伺服器安裝的服務,可以通過網路啟動(PXE)的方式來快速安裝、重裝物理伺服器和虛擬機,同時還可以管理DHCP,DNS等。 Cobbler可以使用命令行方式管理,也提供了基於Web的界面管理工具(cobbler web),還提供了API介面,可以方便二 ...
  • tomcat更新方法最簡單的就是上官網下載最新版的壓縮包,然後用新版本的 lib 文件替換掉舊版本的 lib 文件 具體方法(偷懶做個搬運工):https://jingyan.baidu.com/article/9158e000173f83a25412280b.html ...
  • 前言 本人菜鳥一枚,第一次寫博客,不喜誤噴。 實驗環境 Opensuse15.0(主機)、FreeBSD11.1(虛擬機)、虛擬機VirtualBox5.2.22、mysql8.0.14 在FreeBSD下安裝mysql pkg install mysql80 在 /etc/rc.conf下添加一行 ...
  • 在沒有禁用開源的顯卡驅動 nouveau 下,從 apt 安裝了nvidia的驅動,導致了後面開機後,系統不能正確的識別到顯示器,整個界面解析度變的非常小,在設置菜單中的顯示設置中也不能調節解析度,並有built-in display的提示,推測是兩個顯卡驅動所致,後來又卸載了nvidia的驅動,重 ...
  • 網上的文章鋪天蓋地,適合自己的沒有... 最後老辦法:文章+經驗+嘗試 = 成功,哈哈! 問題和步驟: 1. Xshell 過期了,修改用Free for Home/School版本,https://www.netsarang.com/zh/free-for-home-school/ 前往下載地址, ...
  • 最近需要在mac上連ssh,但是之前在mac上用的都是簡易的SSH Shell,沒有找到傳輸文件的功能。 這時候就非常想念win上的winscp,有個界面,傳點東西還是很直觀的。 幾經搜尋,終於找到一款:zoc 基本滿足了我的需求,ssh,然後有個簡單的文件傳輸。 當然,這個傳輸功能可以用scp來實 ...
  • 簡介 vimtutor是vim這款知名的文本編輯器的學習工具/指南。語法如下。 -g選項和gvimtutor是啟動GUI版本的指南,需要系統支持,一般來說我們只需要鍵入這2種命令形式。 一種啟用英文,一種啟用中文,建議閱讀英文指南。 當我們運行vimtutor的時候,看到是有點類似於man手冊的幫助 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...