套介面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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...