Linux C語言高級編程之Socket網絡編程!

2021-03-02 CPP進階之旅

Socket網絡編程

網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。Socket又稱"套接字",應用程式通常通過"套接字"向網絡發出請求或者應答網絡請求。

基於socket的一對一通信模型

1、服務端:

1)創建socket,使用socket函數;

2)準備通信地址,使用結構體類型;

3)綁定socket和通信地址,使用bind函數;

4)進行通信,使用read/write函數;

5)關閉socket,使用close函數;

2、客戶端:

1)創建socket,使用socket函數;

2)準備通信地址,使用伺服器的地址;

3)連接socket和通信地址,使用connect函數;

4)進行通信,使用read/write函數;

5)關閉socket,使用close函數;

Socket通信相關函數

1、socket函數:創建用於通信的交流點

函數原型:

#include <sys/types.h>    

#include <sys/socket.h>

int  socket(int  domain,  int type, int protocol);

參數解析:

1)域/協議族,決定了本地通信還是網絡通信:

AF_UNIX/AF_LOCAL:表示實現同一個主機的本地通信;

AF_INET:表示基於ipv4的網絡通信;

AF_INET6:表示基於ipv6的網絡通信;

2)通信的方式,決定了選擇何種通信協議:

SOCK_STREAM:提供有序的、可靠的、雙向的以及面向連

接的字節流通信方式,也就是基於tcp協議的通信方式;

SOCK_DGRAM:提供不可靠的,非面向連接的數據報通信

方式,也就是基於udp協議的通信方式;

3)用於指定特殊的協議,默認給0即可;

返回值:成功返回用於交流的描述符,失敗返回-1。

功能:主要用於創建用於通信的交流點。

通信地址的數據類型分文如下三種:

1)通用的通信地址類型:該數據類型專門用於函數的形參類型,很少作為定義變量使用。

struct sockaddr

{

      sa_family_t sa_family;

      char        sa_data[14];

};

2)本地通信的通信地址類型:專門用於本地通信的通信地址類型。

#include <sys/un.h>

struct sockaddr_un

{

    sa_family_t  sun_family;//地址族

    char         sun_path[];//socket文件的路徑名

};

3)網絡通信的通信地址類型:該數據類型專門用於網絡通信。

#include <netinet/in.h>

struct sockaddr_in

{

     sa_family_t  sin_family;//地址族AF_INET.

     in_port_t    sin_port;//埠號 從1025開始使用

     struct in_addr  sin_addr;//IP位址

};

struct in_addr

{

     in_addr_t  s_addr; //整數類型的IP位址

};

2、bind函數:用於綁定socket和通信地址

函數原型:

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

參數解析:

1)socket的描述符,socket函數的返回值;

2)結構體指針,需要做類型轉換;

3)通信地址的大小,使用sizeof計算即可;

返回值:如無錯誤發生,則bind()返回0。否則的話,將返回-1;

功能:主要用於綁定socket和通信地址。

3、connect函數:用於連接socket和通信地址

函數原型:

#include <sys/types.h>   

#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

參數解析:同bind函數

返回值:如無錯誤發生,則bind()返回0。否則的話,將返回-1;

功能:用於連接socket和通信地址,參數和返回值參考bind函數即可。

 

字節序及IP位址轉換相關函數

1、字節序轉換相關函數:

#include <arpa/inet.h>

1)將32位二進位的主機字節序轉換為網絡字節序:

uint32_t htonl(uint32_t hostlong);

2)將16位二進位的主機字節序轉換為網絡字節序:

uint16_t htons(uint16_t hostshort);

3)將32位二進位的網絡字節序轉換為主機字節序:

uint32_t ntohl(uint32_t netlong);

4)將16位二進位的網絡字節序轉換為主機字節序:

uint16_t ntohs(uint16_t netshort);

2、IP位址轉換相關函數:

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

1)將字符串形式的IP位址轉換為整數類型:

in_addr_t inet_addr(const char *cp);

2)

將結構體類型的IP位址轉換為字符串類型:

char *inet_ntoa(struct in_addr in);

相關焦點

  • 程式設計師的術與道:術——編程基本功之網絡編程
    ,包括ethereal/tcpdumphpingnmapnetstatnetpipenetperfvnstatntop三、網絡開發功能工具客戶端/伺服器架構socket 編程數據包抓獲和協議分析libpap 等函數庫實現某個協議參考相關的 RFC 文檔,並通過 socket 編程來實現3.1 linux網絡編程步驟3.1.1 創建套接字
  • 現代程式語言起點,C語言之環境搭建
    C 語言是一種廣泛使用的計算機語言,它與 Java 程式語言一樣普及,二者在現代軟體程式設計師之間都得到廣泛使用。C 語言被廣泛使用,比如:Linux 作業系統和 RDBMS(關係資料庫管理系統) MySQL 都是使用 C 語言編寫的。
  • 基於Socket的java通信編程詳解
    Java最初是作為網絡程式語言出現的,其對網絡提供了高度的支持,使得客戶端和伺服器的溝通變成了現實,而在網絡編程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相關的技術。下面就讓我們一起揭開Socket的神秘面紗。
  • 網絡編程基礎學習筆記2:socket接口及網絡編程三要素
    對於網絡編程而言,由於其底層語言是通過C語言來實現的,所以建議在學習的時候使用C語言來進行學習!網絡編程中常用的socket接口如下:socket()接口,用於創建socket;bind():用於綁定socket到本地地址和埠,通常由服務端調用(客戶端一般直接由connect直接主動去連結服務端);listen():用於開啟監聽模式,TCP專用;accept():用於伺服器等待客戶端連接,該情況一般在阻塞狀態下產生
  • PHP SOCKET編程
    該函數在讀取完 length 個字節數,或到達 EOF 的時候,或(對於網絡流)當一個包可用時就會停止讀取文件,視乎先碰到哪種情況。 可以看出對於網絡流就必須注意取到的是一個完整的包就停止。2、php擴展模塊帶有的socket功能。
  • 嵌入式系統高級C語言編程
    內容簡介  《嵌入式系統高級C語言編程》將主要介紹針對嵌入式系統的基於C語言的軟體項目開發的流程,較為複雜的c語言編程知識和技巧,編程風格和調試習慣
  • Linux C Socket Api詳解
    文章主要梳理於《UNIX 環境高級編程第二版》 第十六章 網絡IPC: 套接字以前都只是在網上搜的能用的例子,對一些參數不是很清楚,這次匯總。而且網絡通信還是很常用的通信手段。UNIX 環境高級編程對Socket通信的描述是套接字網絡IPC(進程間通信),可以用於計算機間通信也可用於計算機內通信,管道、消息隊列、信號量以及共享內存等都是屬於計算機內通信的情況。一、 套接字Api詳細介紹1. 套接字描述符首先會先到的是文件描述符,對Linux一切皆文件的哲學又多懂了一點兒點兒。套接字是通信端點的抽象。
  • 編程是什麼——高級程式語言FORTRAN的問世
    為了更高效地使用計算機,人們設計出了高級程式語言,經過各軟體工程師和專家的不懈努力,1954年,第一個完全意義的高級程式語言FORTRAN問世了,他完全脫離了特定機器的局限性,是第一個通用性的程式語言。用高級程式語言編寫的程序需要經過翻譯,翻譯成機器所能識別的二進位數才能由計算機去執行。
  • Java socket編程
    一,網絡編程中兩個主要的問題一個是如何準確的定位網絡上一臺或多臺主機,另一個就是找到主機後如何可靠高效的進行數據傳輸。在TCP/IP協議中IP層主要負責網絡主機的定位,數據傳輸的路由,由IP位址可以唯一地確定Internet上的一臺主機。
  • 從socket到TCP協議,透徹理解網絡編程
    進行程序開發的同學,無論Web前端開發、Web後端開發,還是搜尋引擎和大數據,幾乎所有的開發領域都會涉及到網絡編程。比如我們進行Web服務端開發,除了Web協議本身依賴網絡外,通常還需要連接資料庫,而資料庫連接通常是通過網絡連接資料庫伺服器,或者資料庫集群,如果負載太高還要搞個緩存集群。我們在上學的時候基本學了網絡編程和網絡協議。
  • 程式語言學哪個比較好?2019年最實用的程式語言
    學習編程關鍵是要找到一種合適的語言,那麼程式語言那麼多,該如何選擇?下面萬古網校小編為大家分享一篇關於程式語言選擇的文章,希望能給你帶來幫助!第一大類語言包括Java、C、Python和C++。第三類語言則是Objective-C和R。1、java-大眾化的程式語言Java是歷史最悠久的程式語言之一。Java可謂是Web應用程式、桌面程序、作業系統及更多系統的立足之本。這種面向對象、基於類的程式語言廣泛使用;此外,它也是最受歡迎的語言之一。
  • 網絡編程基礎之Socket概述
    概念Socket接口是TCP/IP網絡的API,通過此接口,可以開發TCP/IP網絡上的應用程式。Socket接口是一種特殊的I/O,也是一種文件描述符。我們調用類似於打開文件的函數打開Socket,會返回一個Socket描述符。
  • Linux系統下socket編程socket接口介紹(二)
    (這個轉換完後不能用於網絡傳輸,還需要調用htons或htonl函數才能將主機字節順序轉化為網絡字節順序,這兩個函數先不講,實戰遇到的話,再進行解析),具體可以看下面Linux的源文: inet_aton()  converts  the  Internet  host  address  cp  from  the  IPv4  numbers-and-dots
  • 為什麼要學習「 C」程式語言?
    「 C」編程是另一種程式語言的基本基礎,像java、php,C++等熱門程式語言都是「 C」編程最為底層開發,所以我們通常稱「 C」編程編程「母語」。「 C」編程是一種簡單的語言,可以更快地執行。「 C」編程還是一種極其緊湊的語言,這意味著以「 C」編程方式尋址的程序可以在不同的機器上運行。C程式語言的優勢作為中級語言,C連接了低級和高級語言的功能。C語言可用於底層編程。例如用於內核和驅動程序的腳本,它還有助於使用高級程式語言,例如用於軟體應用程式的腳本等。
  • 自學編程第1節:程式語言有哪些,什麼關係?彙編C/C++,JAVA簡介
    首先,謝謝大家點擊閱讀獵奇哥的編程系列教程,後期慢慢補充,詳細介紹C語言,C++語言編程的方方面面,儘量幫助大家能夠儘量簡單的學會C++編程核心入門知識。總章節數待定,視內容的更新情況。說起編程,最早的是彙編語言,這種語言大家通常叫做低級語言,做一個程序,需要非常多的指令和代碼,完成的卻是一個非常簡單的功能,程式設計師的工作量非常大,當然,那個時期,電腦的功能也沒有現在的這麼強大,彙編對於當時來說,也是夠用。
  • Python網絡編程socket模塊實例解析
    網絡也是IO的一種,在Python中有專門的socket模塊用來處理網絡操作的。
  • C語言編程工具的選擇
    我們計算機專業沒有C語言這門課。其他工科專業會學C語言這門課。據我所知,其他的工科專業需要過C語言2級考試。計算機專業不用考2級、3級...這些考試。我們計算機專業學的第一門程式語言是C++。那我們當時老師上課是用什麼編程工具的?是VC++ 6.0。VC++6.0界面簡潔(簡陋),沒有多餘花哨的功能,淡白色的界面。
  • 程式語言種類繁多,為什麼提倡大家學習C語言!
    有句話說「十年都不敢說精通C語言」,是有一定的道理的。所以,這裡從宏觀上來看待 C 語言。程式語言一開始是由 0101 這些機器碼編程開始的,那時候的編程的確是一種只有高智商的人方可做的工作,因為你得背誦一堆堆的指令,如:ADD指令假設為10011100,這你得記住!這樣的編程要麻煩的多,也不利於普及,人數力量有限,就不能把功能做的太強大。
  • Linux系統下的c語言編程規範整理
    每一種程式語言都有它獨特的編程規範,畢竟無規矩不成方圓,如果編碼不規範,一方面程序顯得晦澀難懂,讓其他讀者維護起來特別困難;另一方面自己再次查看的時候也會有一定困難。今天小編就來聊聊Linux環境下c語言編程的規範。
  • Linux下C編程基礎之:本章小結與思考與練習
    3.8 本章小結本章是Linux中進行C語言編程的基礎,首先講解了C語言編程的關鍵點,這裡關鍵要了解編輯器、編譯連結器、調試器及項目管理工具等概念。