Linux網路程式設計 socket程式設計

2021-10-07 04:15:08 字數 4091 閱讀 4793

套接字是在進行網路連線時最重要的部分之一!

套接字socket就相當於是,乙個檔案操作符,不佔空間。但是這個套接字對應這兩個緩衝區:傳送端緩衝區和接收端緩衝區,如下圖所示。兩個套接字的連線就是通過ip和埠。

1.3.1、ip轉換函式(其一,該函式比較常用,在linux幫助手冊的第11章):

- 標頭檔案 #include
函式const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

其中inet_pton和inet_ntop不僅可以轉換ipv4的in_addr,還可以轉換ipv6的in6_addr,

返回值:如果第乙個引數af 不包含有效的位址族,則返回負值並將 errno 設定為 eafnosupport。 如果 src 不包含表示指定位址族中的有效網路位址的字串,則返回0。

如果網路位址成功轉換,則返回正值。

1.3.2、ip轉換函式(其二)

#include

uint32_t htonl

(uint32_t hostlong)

;//主機位元組序轉網路位元組序,對無符號長型進行操作4bytes

uint16_t htons

(uint16_t hostshort)

; uint32_t ntohl

(uint32_t netlong)

; uint16_t ntohs

(uint16_t netshort)

;

上面的函式中 h表示host,n表示network,l表示32位長整數,s表示16位短整數。 如果主機是小端位元組序,這些函式將引數做相應的大小端轉換然後返回,如果主機是大端位元組序,這些函式不做轉換,將引數原封不動地返回。

tcp協議:為了在不可靠的網際網路絡上提供可靠的端到端位元組流而專門設計的乙個傳輸協議。

-------------------------前期工作----------------------

伺服器工作流程:

建立socket物件,指定通訊協議(tcp)

socket物件和ip位址埠(prot)進行bind繫結

監聽操作(=》讀寫)

客戶端的工作流程:

建立socket物件,指定通訊協議(tcp)

指定ip位址,埠,建立連線connect()

客戶端傳送連線請求

read等待伺服器的應答(接受我連線請求申請)

-------------------------資訊互動工作----------------------

雙方通訊

----------------------------收工工作-------------------------

關閉socket,斷開連線

建立套接字

繫結bind

監聽listen

接受accept

和客戶端互動資料read write

引數2:type

引數3:protocol: 0 預設協議

返回值:成功返回乙個新的檔案描述符,失敗返回-1,設定errno。

在解釋繫結之前要先解釋一下sockaddr資料結構和sockaddr_in資料結構。

在以前的時候是使用struct sockaddr沒有細分,現在的話是使用struct sockaddr_in,而現在sockaddr退化成了(void *)的作用(即:返回出乙個無型別指標,傳遞乙個位址給函式),但是在程式設計中的bind還是儲存著以前的struct sockaddr的,所以我們在寫bind函式的時候需要把struct sockaddr_in強轉成

struct sockaddr。

2.3.1、sockaddr資料結構

struct sockaddr

;

2.3.2、sockaddr資料結構

struct sockaddr_in結構體

struct sockaddr_in

;

在伺服器程式中,監聽的網路位址和端一般ip和埠是不會變的,乙個客戶端要是知道伺服器的位址和埠號就可以向伺服器發起連線,所以伺服器需要呼叫bind來繫結乙個固定的網路位址和埠號。

struct sockaddr_in servaddr;

//建立乙個struct sockaddr_in結構體

bzero

(&servaddr,

sizeof

(servaddr));

//出始化一下這個位址(就相當於malloc出乙個位址空間,就要緊接著memset乙個道理)

servaddr.sin_family = af_inet;

//位址家族賦值,通常大多用的是都是af_inet,代表tcp/ip協議族

servaddr.sin_addr.s_addr =

htonl

(inaddr_any)

;// inaddr_any這個巨集就是可以將任意本機可用ip位址轉成網路位元組序,可用ifconfig查詢虛擬機器的ip

servaddr.sin_port =

htons

(8000);

//短整型無符號埠號轉成網路位元組序列

//當以上這些函式執行完了之後我們再執行bind函式

bind

( sfd,

(struct sockaddr*

)&servaddr,

sizeof

(servaddr)

);

典型的伺服器程式可以同時服務於多個客戶端,當有客戶端發起連線時,伺服器呼叫的 accept()返回並接受這個連線,如果有大量的客戶端發起連線而伺服器來不及處理,尚未 accept的客戶端就處於連線等待狀態。listen()函式宣告sockfd處於監聽狀態,並且最多允許有 backlog個客戶端處於連接待狀態(在listen()函式中可以設定這個backlog數量的多少),如果接收到更多的連線請求就忽略。(說白了,這函式的功能就是要和客戶端建立三次握手和阻礙超過指定數量外的客戶端)。

該函式在三次握手後執行的函式

執行完這函式,我們能獲得到乙個全新的套接字,和該套接字的ip埠,這個套接字就是用來專門和客戶端通訊用的。

然後我們再通過

char ipstr[

128]

;inet_ntop

(af_inet,

&addr.sin_addr.s_addr ,ipstr ,

sizeof

(ipstr));

ntohs

(addr.sin_port)

;//返回埠號

伺服器**

#include

#include

#include

#include

#include

#include

#include

#define server_port 8000

//這裡定義乙個埠

intmain

(void

)close

(cfd)

;close

(sfd)

;return0;

}

**,這裡的**也可以不要,在linux終端輸入 nc ip號 埠號就可以連線伺服器,比如nc 127.0.01

#include

#include

#include

#include

#include

#include

#include

#define server_port 8000

//這裡定義乙個埠

intmain

(void

)close

(sfd)

;return0;

}

linux網路程式設計 SOCKET

今天在工作中接觸到了tcp,專案需求是利用海思平台將獲取到的相機資料通過網路將資料傳送給上位機。利用這個機會好好學習了一下網路這方面的東西。socket 相關的結構體 struct sockaddr in 在使用過程中一般需要初始化的引數一般是sin family sin port和sin addr...

linux網路程式設計之Socket

一.socket socket可看作是使用者程序與核心網路協議的程式設計介面.socket可用於本機程序間的通訊,也可用於網路上不同主機間的程序通訊.下圖顯示的是各種網路協議的位址格式 1.struct socketaddr 通用位址結構 通過獲取某種socketaddr結構體的首位址,不需要知道具...

網路程式設計 Socket程式設計

一 網路部分 1.ip 2.埠號 在網路協議中使用埠號識別主機上不同的程序,不同的埠對應於不同的服務 應用程式 3.協議 tcp二 socket部門socket通訊基本流程圖 根據socket通訊基本流程圖,總結通訊的基本步驟 伺服器端 第一步 建立乙個用於監聽連線的socket對像 第二步 用指定...