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,...