網路程式設計第三章 套接字程式設計簡介

2021-10-04 17:10:42 字數 3623 閱讀 2533

#include

"unp.h"

struct in_addr

;struct sockaddr_in

;//tcp或者埠總是以網路位元組序來儲存

//套接字位址結構僅僅在給定主機上使用,雖然某些字段用於通訊,但是結構本身並不用於通訊

//通用套接字位址結構:作為引數傳遞任何套接字函式的時候,套接字總是以引用的方式傳遞,所以要有乙個通用的位址結構,如下:

struct sockaddr

;//呼叫的時候,要進行強制型別轉換

struct sockaddr_in serv;

bind

(sockfd,

(struct sockaddr*

)&serv,

sizeof

(serv));

//可以將bind函式看作是乙個通用的函式介面卡,它接受乙個可呼叫物件,生成乙個新的可呼叫物件來「適應」原物件的引數列表。

//ipv6套接字位址結構,在標頭檔案中定義

struct in6_addr

;#define sin6_len

struct sockaddr_in6

;//新的套接字結構:

struct sockaddr_storage

;//如果系統有位元組對齊要求,那麼這個能夠滿足

//除了這兩個字段,其他欄位對使用者來講是透明的,

//不同套接字的位址長度不同(比如,unix域位址長度固定,但是資訊不固定)

//值結果引數定義:getpeername(unixfd, (sa *)&cli, &len);本例中 getpeername 函式的入參 len 本身有值,即結構體變數 cli 的大小,用於告訴核心待會寫 cli 的值時別寫越界了,它只有 len 的大小;

//網路程式設計中的定義:當函式引數是從 核心 到 程序 時:

//函式被呼叫時,引數大小是乙個值,程序告訴核心該引數的結構大小避免核心寫操作越界;

//函式返回時,引數的結構大小又是乙個結果,應用程序可以知道核心所寫資料的大小。

//往往涉及到兩個引數:儲存資料的結構體指標 和 儲存結構體大小的整數指標

//位元組排序函式**例項

#include

"unp.h"

#include

using

namespace std;

intmain()

un; un.s=

0x0102;if

(sizeof

(short)==

2)else

return0;

}//位序:沒有看懂,,,

//位元組序之間的轉換函式(主機位元組序和網路位元組序不一定相同)

#include

//以下兩個函式返回網路位元組序的值

uint16_t

htons

(uint16_t host16bitvalue)

;uint32_t

htonl

(uint16_t host32bitvalue)

;//以下兩個函式返回主機位元組序的值,

uint16_t

ntohs

(uint16_t host16bitvalue)

;uint32_t

ntohl

(uint16_t host32bitvalue)

;//h代表host主機,n代表network,s代表short,l代表long(要把long視為乙個32位的值)

//字操縱函式:

#include

void bzero (

void

*dest,size_t mybytes)

//指定位元組數字清零

void

bcopy

(const

void

*src,

void

*dest,size_t mbytes)

//從源到目的複製指定數量位元組

intbcmp

(const

void

*ptr1,

const

void

*ptr2,size_t mybytes)

//相同返回值為0,否則非0

#include

void

memset

(void

*dest,size_t len)

//目的位址清零

void

memcpy

(void

*dest,

const

void

*src,size_t nbytes)

//指定數目的位元組數置為c

void

memcmp

(const

void

*ptr1,

const

void

*ptr2,size_t nbytes)

//比較兩個字串,相同就返回0,否則返回非0

//兩組位址轉換函式

#include

intinet_aton

(cosnt char

* strptr,

struct in_addr,

*addrptr)

//將乙個字串點分十進位制ip4位址轉換為網路位元組序二進位制序

char

*inet_ntoa

(struct in_addr inaddr)

;//將網路位元組序轉換為點分十進位制

//ipv6位址轉換:

#incldue

intinet_pton

(int family,cosnt char

*strptr,

void

*addrptr)

;//吧字串轉換為二進位制序,如果成功就返回,不是有效的表示式返回0,出錯返回-1

intinet_ntop

(int family,

const

void

*addrptr,

char

*strptr,size_t len)

;//二進位制序轉化為點分十進位制,len是char的長度,避免緩衝區溢位

//如果當前機器不支援ipv6.也可以用以上兩個函式

foo.sin_addr.s_addr=

inet_addr

(cp)

;//等同於inet_pton(af_inet,cp,&foo.sin_addr)

char ptr=

inet_ntoa

(foo.sin_addr)

;//等同於:char ptr[ ] =inet_ptoa(af_inet,&foo.sin_addr,str,sizeof(str))

//sock_ntop和相關函式:

//在網路程式設計卷一p70,這是一些包裹函式

/*readn,writen,readline函式

位元組流套接字呼叫readn或者writen輸出輸入的位元組數可能會少(因為核心用於套接字的緩衝區已滿):這時要再次呼叫readn或者writen,用來輸入輸出剩餘的位元組

readline函式是非常慢的,因為這個函式每讀入乙個位元組就會呼叫一次read函式,stdio提供的標準輸入輸出很誘人,但是容易有錯誤.詳見p74

*/

《UNIX網路程式設計》 第三章 套接字程式設計簡介

ipv4的位址結構為sockaddr in,ipv6為sockaddr in6,鏈路協議sockaddr dl,unix域為sockaddr un,儲存為sockaddr storage。套接字位址結構總是以引用形式來傳遞!struct in addr struct sockaddr in ipv4...

UNP 第三章,套接字程式設計介紹

1.套接字結構 多數套接字函式都有套接字結構引數,每個協議族都定義了自己的套接字結構,以 sockaddr 開始,並對應協議族的唯一字尾。struct sockaddr in 對應用層程式設計而言,重要的只有 sin family,sin addr,sin port 2.位元組序 網路位元組序為大端...

unix 網路程式設計 第三章

包裹函式 就是對有錯誤返回值的函式的封裝。在unix網路程式設計中用大寫表示。err sys 必須要errno 的值才能輸出錯誤?執行緒函式遇到錯誤的時候 不設定errno的值,而是把error的值作為函式的返回值。必須檢查某個確定的錯誤,並處理它,而不是終止程序執行。unix errno 值 每當...