1. 程式人生 > >網路知識總結---(四)Linux網路程式設計基礎API

網路知識總結---(四)Linux網路程式設計基礎API

socket地址API

主機位元組序與網路位元組序

主機位元組序:PC機多采用小端位元組序,因此小端位元組序又被稱為主機位元組序。
網路位元組序:大端位元組序。

Linux下完成主機位元組序和網路位元組序的轉換:

#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned long int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned
short int ntohs(unsigned long int netlong);

長整型一般用來轉換IP地址,短整型一般用來轉換埠號。

socket地址

Linux為各個協議提供了專門的socket地址結構體.
UNIX本地協議族

#include<sys/un.h>
struct socketadd_un
{
    sa_family_t sin_family; // 地址族:AF_UNIX
    char sun_path[108]; // 檔案路徑名
}

TCP/IP協議族有 sockaddr_in 和 sockaddr_in6 兩個專用 socket 地址結構體,分別表示IPv4 和IPv6。

#include<sys/in.h>
struct sockaddr_in
{
    sa_family_t sin_family; // 地址族:AF_INET
    u_int16_t sin_port; // 埠號:網路位元組序表示
    struct in_addr sin_addr; // IPv4結構體
}

struct in_addr
{
    u_int32_t s_addr; // IPv4地址,網路位元組序表示
}

地址族通常與協議族相對應:
這裡寫圖片描述

IP地址轉換函式

我們通常讀IP地址採用的點分十進位制,但是在程式設計時需要轉換為二進位制數。

#include<arpa/inet.h>
in_addr_t inet_addr(const char* strptr); // 點分十進位制轉換為網路位元組序,失敗返回INADDR_NONE int inet_aton(const char* cp, struct in_addr* inp); // 點分十進位制->網路位元組序,結果存在inp指向的地址結構體中 char* inet_ntoa(const in_addr in); // 網路位元組序->點分十進位制,使用靜態變數儲存結果,不可重入

建立socket

socket就是一個可讀、可寫、可控制、可關閉的檔案描述符。

#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);

domain:使用哪個底層協議族。TCP/IP設定為 PF_INET 或 PF_INNET6。
type:服務型別,SOCK_STREAM(流服務)和SOCK_UGRAM(資料報),可對應TCP與UDP。
protocol:一般置 0 ,表示預設協議。

命名socket(bind)

建立socket時,指定了地址族,但是沒有指定該地址族的哪個具體socket地址。將一個 socket 與 socket 地址繫結稱為 給socket 命名。客戶端不需要命名,作業系統自動分配socket地址。命名socket使用bind函式,

#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);

bind 將 my_addr 所指的 socket 地址分配給未命名的檔案描述符 sockfd ,addrlen 引數指出該 socket 地址的長度
成功返回 0 失敗返回 -1 並設定 errno。常見兩種errno:
- EACCES:被繫結的地址是受保護的地址,普通使用者繫結到知名伺服器埠號
- EADDRINUSE:被繫結的埠正在使用。比如繫結到一個處於 TIME_WAIT 的 socket 地址。

監聽socket(listen)

命名 socket 後建立一個監聽佇列以存放待處理的客戶連線。

#include<sys/socket.h>
int listen(int sockfd, int backlog);

socket:被監聽的 socket
backlog:核心監聽佇列的最大長度,典型值為 5 ,監聽佇列的長度如果超過 backlog ,伺服器將不受理新的客戶連線,客戶端將收到 ECONNREFUSED 錯誤資訊。

接受連線(accept)

從 listen 佇列中接受一個連線。

#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);

sockfd:執行過 listen 系統呼叫的監聽 socket
addr:獲取被接受連線的遠端 socket 地址
addrlen:addr 的長度
accept成功:返回一個新的連線 socket ,該 socket 唯一的標識了被接受的這個連線,伺服器可以通過讀寫該 socket 來與被接受連線對應的客戶端通訊。

發起連線(connect)

伺服器通過 listen 呼叫來被動接受連線,客戶端通過 connect 主動也伺服器建立連線。

#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd, const struct sockadd* serv_addr, soklen_t addrlen);

sockfd:由socket 系統呼叫返回一個 socket
serv_addr:伺服器監聽的 socket 地址
addrlen:指定這個地址的長度

關閉連線

關閉對應的 socket ,關閉 sockfd 這個檔案描述符即可

#include<unistd.h>
int close(int fd);

fd 是待關閉的 socket ,但是,close 系統呼叫並非總是立即關閉一個連線,而是將 fd 引用計數減一。只有當 fd 的引用計數為 0 時,才真正關閉連線。
多程序中,一次 fork 系統呼叫預設使父程序中開啟 socket 的引用計數加一,因此,父子程序都要 close 才能關閉連線。

如果無論如何都要終止連線,使用 shutdown 呼叫

#include<sys/socket.h>
int shutdouwn(int sockfd,int howto);

sockfd:待關閉的 socket
howto:shutdown 行為

這裡寫圖片描述

資料讀寫

TCP資料讀寫

對檔案的讀寫操作 read() 和 write() 同樣適用 socket。為了增加對資料讀寫的控制,socket 程式設計介面提供了專用的系統呼叫,對於TCP資料流讀寫:

#include<sys/types.h>
#include<sys/socket.h>
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);

buf 和 len:指定讀取緩衝區的位置和大小
falgs:通常設為 0

UDP資料讀寫

socket 程式設計介面用於UDP資料報讀寫的系統呼叫:

#include<sys/types.h>
#include<sys/socket.h>
ssize_t recvfrom(int sockfd, void* buf, size_t len, int flags, struct sockaddr* src_addr, socklen_t* addrlen);
ssize_t sendto(int sockfd, const void* buf, size_t len, int flags, const struct sockaddr* dest_addr, socklen_t* addrlen);

因為UDP通訊是無連線的,所以每次讀取資料都需要獲取傳送端的 socket 地址,即 src_addr 所指的內容,addrlen 所指的長度。

通用資料讀寫函式

#include<sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr* msg, int flags);
ssize_t sendmsg(int sockfd, struct msghdr* msg, int flags);

結構中包含所需的資訊。

相關推薦

網路知識總結---Linux網路程式設計基礎API

socket地址API 主機位元組序與網路位元組序 主機位元組序:PC機多采用小端位元組序,因此小端位元組序又被稱為主機位元組序。 網路位元組序:大端位元組序。 Linux下完成主機位元組序和網路位元組序的轉換: #include<netin

linux基礎知識總結

基礎知識第四周學習總結 目錄 一.知識脈絡圖二.軟件包管理三.磁盤管理 一.知識脈絡圖 二.軟件包管理 1.軟件組成 二進制應用程序的組成部分: 二進制文件,庫文件,配置文件,幫助文件 庫文件: 庫文件是一個很特殊的存在,他對於很多程序起著支持作用,如果不小心

網路程式設計教程Linux網路程式設計基礎API

        首先介紹Linux下整個的網路程式設計流程: 一、socket地址API 1.主機位元組序和網路位元組序         位元組序分為大端位元組序(big endian)和小端位元組序(little endian)。大端位元組序是指一個整數的搞我位元

運維工作中經常用到的一些知識總結

Lftp SLA yourls Tomcat多實例 接上篇:http://blog.51cto.com/bobo365/2125159 54、rabbitMQ http://blog.csdn.net/lishaojun0115/article/details/53152255 用戶管理 用戶

JAVA面試常問知識總結——集合

先附一張java集合框架圖   下面根據面試中常問的關於集合的問題進行了梳理: Arraylist 與 LinkedList 有什麼不同? 1. 是否保證執行緒安全: ArrayList 和 LinkedList 都是不同步的,也就是不保證執行緒安全; 2. 底

網路程式設計理論知識總結層、七層網路模型

一、OSI七層網路模型 在網路歷史的早期,國際標準化組織(ISO)和國際電報電話諮詢委員會(CCITT)共同出版了開放系統互聯的七層參考模型。一臺計算機作業系統中的網路過程包括從應用請求(在協議棧的頂

網路相關基礎知識總結吞吐量測試&吞吐量與頻寬區別

一.概念 網路中的資料是由一個個資料包組成,防火牆對每個資料包的處理要耗費資源。吞吐量是指在沒有幀丟失的情況下,裝置能夠接受的最大速率。 1.作用地位 網路吞吐量測試是網路維護和故障查詢中最重要的手段之一,尤其是在分析與網路效能相關的問題時吞吐量的測試是必備的測試手段。 作為驗證和測試網

網路相關基礎知識總結吞吐量測試&吞吐量與頻寬區別

一.概念 網路中的資料是由一個個資料包組成,防火牆對每個資料包的處理要耗費資源。吞吐量是指在沒有幀丟失的情況下,裝置能夠接受的最大速率。 1.作用地位 網路吞吐量測試是網路維護和故障查詢中最重要的手段之一,尤其是在分析與網路效能相關的問題時吞吐量的測試是必備的測試手段。

計算機網路總結

本篇文章核心內容: (1)如何通過資料鏈路層對乙太網進行擴充套件 (2)交換機和路由器的區別 1、在資料鏈路層擴充套件乙太網 之所以說在資料鏈路層擴充套件乙太網那是因為也可以在物理層通過使用多個集線器的方式擴充套件乙太網。 在資料鏈

linux基礎知識總結

界面 當前日期 ech sed文本處理 時間 sed 簡單的 編寫 代碼 第三周學習總結 目錄 一.知識脈絡圖二.shell腳本三.shell登錄方式四.文件查找和壓縮及tar五.簡單的sed文本處理 一.知識脈絡圖 二.shell腳本 1.shell腳本簡介

軟考總結---作業系統知識

前言:下面和大家分享一下第四章的知識點,希望對大家有幫助。 (一)作業系統概述 1.【作業系統定義】 能有效地組織和管理系統中的各種軟/硬體資源,合理地組織計算機系統工作流程,控制程式的執行,並且向用戶提供一個良好的工作環境和友好的介面。 2.【作用】 通過對資源管理

軟考總結---計算機網路概論

前言:下面和大家分享一下第一章的知識點,希望對大家有幫助。 (一)計算機系統基礎知識 1.計算機硬體組成 由運算器、控制器、儲存器、輸入裝置和輸出裝置5大部件組成。 2.CPU的功能 程式控制(程式的執行順序) 操作控制(一條指令功能的實現需要若干操作型號配合來完成)

深度學習筆記——神經網路和深度學習淺層神經網路

1.神經網路概覽 神經網路的結構與邏輯迴歸類似,只是神經網路的層數比邏輯迴歸多一層,多出來的中間那層稱為隱藏層或中間層。從計算上來說,神經網路的正向傳播和反向傳播過程只是比邏輯迴歸多了一次重複的計算。正向傳播過程分成兩層,第一層是輸入層到隱藏層,用上標[1]來表示;第二層是隱藏層到輸出層,用上標

計算機網路知識點總結1

除了標準的OSI七層模型以外,常見的網路層次劃分還有TCP/IP四層協議以及TCP/IP五層協議,它們之間的對應關係如下圖所示: 以OSI七層協議為例,依次介紹下各層:   1)物理層(Physical Layer)   啟用、維持、關閉通訊端點之間的機械特性、

機器學習西瓜書學習筆記---------神經網路

1. 神經元模型 神經網路/人工神經網路:由具有適應性的簡單單元組成的廣泛並行互連的網路。 神經網路學習:機器學習和神經網路兩個學科交叉的部分。 Neural Networks中的基本單元:神經元。 從電腦科學的角度,NN就是一個包含了大量引數的數學模型,該模型由若干個函式相互代入而

Linux學習筆記10linux網路管理與配置之一——主機名與IP地址

Linux學習筆記(10)linux網路管理與配置之一——主機名與IP地址 大綱目錄 0.常用linux基礎網路命令 1.配置主機名 2.配置網絡卡資訊與IP地址 3.配置DNS客戶端 4.配置名稱解析順序 5.配置路由與預設閘道器 6.雙網絡卡繫結   1.配置主機名 1.1

Docker學習總結21——Docke網路bridge詳解

Docker 安裝時會建立一個 命名為 docker0的 linux bridge。如果不指定--network,建立的容器預設都會掛到docker0上。 當前 docker0 上沒有任何其他網路

一站式學習Wireshark網路效能排查之TCP重傳與重複ACK

作為網路管理員,很多時間必然會耗費在修復慢速伺服器和其他終端。但使用者感到網路執行緩慢並不意味著就是網路問題。 解決網路效能問題,首先從TCP錯誤恢復功能(TCP重傳與重複ACK)和流控功能說起。之後闡述如何發現網路慢速之源。最後,對網路各組成部分上的資料流進行概況

Cisco 思科計算機網路 見習總結路由器密碼破解,telnet遠端登陸

今天是見習第一天,學了兩個實驗和一堆理論,感覺作為一名又學計算機又學數學的渣渣,還是提前多學點計算機基礎吧,以後搬磚還有人要不是嘛~至少我會接網線。 第一個實驗:路由器密碼恢復實驗(破解別人的路由器,找回自己的密碼) 1、開啟Cisco packet,拉出兩

2017CS231n李飛飛深度視覺識別筆記——神經網路

第四講 神經網路課時1 反向傳播    目前,我們已經講了怎麼定義一個分類器、怎麼定義一個損失函式以及它的正則化,也討論了用梯度下降的方法找到最小化的損失函式。    接下來,將討論如何計算任意複雜函式