Socket程式設計 API

2021-09-19 11:58:46 字數 4329 閱讀 5638

socket可以看成是使用者程序與核心網路協議棧的程式設計介面

socket不僅可以用於本機的程序間通訊,還可以用於網路上不同主機間的通訊。

ipv4套介面位址結構

ipv4套介面位址結構通常也稱為「網際套接字位址結構」,它以「sockaddr_in」命名,定義在標頭檔案中

struct sockaddr_in
通用位址結構通用位址結構用來指定與套接字關聯的位址

struct sockaddr
上面兩個位址結構的大小是相等的。

埠號是什麼?

一台主機可以用乙個ip來標識,那麼主機中的程序用什麼標識呢,用埠號。知名埠號0到1023分配給了一些固定服務,比如ftp:21、http:80等等。1024到65535動態分配,應用程式的區分用埠號。

位元組序

int a=0x12345678

大端模式:

數值小的放到高位,大端模式

小端模式:

數值大的放到低位,小端模式

那麼如何測試自己電腦什麼模式呢?

int

main()

結果如下:

所以我的為小端模式。

網路也有網路在位元組序,在兩個不同主機進行通訊的時候

本地位元組序--->網路位元組序--->本地位元組序

位元組序轉換函式

//h代表host,n代表networks,s代表short,l代表long

uint32_t htonl

(uint32_t hostlong)

;//主機long轉成網路long

uint16_t htons

(uint16_t hostshort)

;//主機short轉成網路short

uint32_t ntohl

(uint32_t netlong)

;//網路long轉成網路long

uint16_t ntohs

(uint16_t netshort)

;//網路short轉成網路short

這裡插乙個問題,這個uint32_t、uint16_t是什麼意思呢?其實在linux中以_t結尾的都是自定義型別。為什麼這樣做呢?

typedef

unsigned

int size_t;

//四個位元組32位。

但是我們需要將資料型別大小變成64位時,如果我們使用的是:

unsigned

int a;

unsigned

int b;

是不是需要將所有的unsigned

int 變成long

long

long a;

long b;

這樣的話比較麻煩。

如果我們這樣定義的呢?

size_t a;

size_t b;

size_t c;

我們只需要將typedef

unsigned

int size_t;改為:

typedef

long

long size_t;就可以了方便開發。

位址轉換函式在tcp/ip中ipv4是32位====>192.168.3.22(點分式的ip)

#include

#include

typedef uint32_t in_addr_t;

struct in_addr

;int

inet_aton

(const

char

*cp,

struct in_addr *inp)

;//將192.168.3.22轉換成乙個32位整數

int_addr_t inet_addr

(const

char

*cp)

;//將cp(192.168.322)轉換成乙個struct in_addr結構

char

*inet_ntoa

(struct in_addr in)

;//借用了你的記憶體,將結構struct int_addr轉換成乙個點分式的ip(192.168.3.22)

socket函式

#include

/* see notes */

#include

//建立乙個套接字用於通訊

/**@domain:指定通訊協議族(protocol family)

*@type:指定socket型別,流式套接字sock_stream(tcp),資料報套接字sock_dgram(udp),原始套機子sock_raw

*@protocol:協議型別

*@return 成功返回非負整數,與檔案描述符類似,稱為套介面描述字,簡稱套接字,失敗返回-1;

*/int

socket

(int domain,

int type,

int protocol)

;//實際返回乙個檔案控制代碼

bind函式

#include

/* see notes */

#include

//繫結本地位址到套接字

/**@sockfd socket函式返回的套接字

*@addr 要繫結的位址

*@addrlen:位址長度

*@return:成功放回0,失敗返回-1

*/int

bind

(int sockfd,

const

struct sockaddr *addr,socklen_t addrlen)

;

listen函式

#include

/* see notes */

#include

//一般來說,listen函式應該在抵用socket和bind函式之後,嗲用函式accept之前呼叫

//對於給定的監聽套介面,核心要維護兩個佇列:

//1、已由客戶端發出並到達伺服器,伺服器正在等待完成相應的tcp三次握手過程

//2、已完成三次握手的連線的佇列

intlisten

(int sockfd,

int backlog)

;

accept函式

#include

/* see notes */

#include

/**@sockfd:伺服器套接字

*@addrlen:返回等待方的套接字位址長度

*/int

accept

(int sockfd,

struct sockaddr *addr, socklen_t *addrlen)

;

connect函式

#include

/* see notes */

#include

/**@sockfd:未連線套接字

*@addr:要連線的套接字位址

*@addrlen:第二個引數addr長度

*@return:成功返回0,失敗返回-1

*/int

connect

(int sockfd,

const

struct sockaddr *addr,socklen_t addrlen)

;

socket程式設計API總結

一 注釋 1.cpp view plain copy include include include include include include include include define servport 3333 define backlog 10 define max connected...

記錄幾個跟socket程式設計相關的API

htonl函式 將主機數轉換成無符號長整型的網路位元組順序。本函式將乙個32位數從主機位元組順序轉換成網路位元組順序。uint32 t htonl uint32 t hostlong htons 函式 將主機的無符號短整形數轉換成網路位元組順序。hostshort 主機位元組順序表達的16位數。u ...

Socket基本API 總結

套接字建立過程 srever 1socket建立套接字 2bind ip和port 3listen 4accept 5read write 6close client 1socket 2connect 3read write 4closeint socket int domain,int type,...