TCP IP網路程式設計 第3章 套接字位址結構

2021-09-17 04:43:33 字數 2862 閱讀 9856

struct sockaddr_in

該結構體中的in_addr定義如下

struct in_addr

上面的in_addr_tuint32_t型別,即unsigned 32-bit int(unsigned long),定義在標頭檔案sys/types.h中

in_port_tuint16_t型別,即unsigned 32-bit int(unsigned short),定義在標頭檔案sys/types.h中

sin_family:每種協議族適用的位址族不同,比如ipv4使用4位元組位址族,ipv6使用16位元組位址族

af_inet6         ipv6網路協議中使用的位址族

af_local        unix協議本地通訊中使用的位址族

sin_port:以網路位元組序儲存16位埠號

sin_addr:以網路位元組序儲存32位ip位址

sin_zero:無含義,只為使結構體sockaddr_in的大小與sockaddr保持一致而插入。必須填充為0;

bind函式原型:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

因為直接向struct sockaddr 結構體填充位址族,埠號和ip位址會很麻煩。

struct sockaddr 函式原型:

struct sockaddr

主流intel系列cpu以小端序方式儲存資料

網路位元組序統一為大端序

所以我們需要使用位元組序轉換,以下是常用的位元組序轉換函式:

unsigned short htons(unsigned short);

unsigned short ntohs(unsigned short);

unsigned long htonl(unsigned long);

unsigned long ntohl(unsigned long);

// h代表host

// n代表network

注意:資料收發過程中的位元組序轉換是自動的,只有填充sockaddr_in結構體時需要手動完成。

1.5.1 inet_addr函式:

sockaddr_in中儲存的位址資訊為32位整數型,inet_addr函式將幫助我們把ip位址轉換為整數型,

同時也為我們做了網路位元組序轉換

#include in_addr_t inet_addr(const char * string);   //把字串格式的ip位址轉為32位整型,並以大端序返回

//成功返回32位大端序整數型值,失敗返回-1(inaddr_none)

1.5.2 inet_aton函式

inet_aton函式不僅可以將字串形式ip位址轉換為32位網路位元組序整數返回,

還能直接將轉換好的ip位址寫入in_addr結構體變數中,

#include int inet_aton(const char * string, struct in_addr * addr); 

// 成功返回1(true),失敗返回0(false)

1.5.3  inet_aton函式:

inet_aton函式功能相反的inet_ntoa函式可以將整型ip位址轉換為字串格式並返回

#include char * inet_ntoa(struct in_addr adr);   // 將整型ip轉換為字串ip

// 成功返回轉換的字串位址值,失敗返回-1

注意:inet_aton函式返回型別為char指標,意味著該函式將字串的值儲存在了自動在內部申請的記憶體。

所以程式設計師應將該字串拷貝到其他記憶體空間,否則再次呼叫該函式時,上一次的結果可能會被覆蓋。

建立伺服器端套接字時,若不想手動指定ip位址,可以使用

addr.sin_addr.s_addr = htonl(inaddr_any);

這樣可以自動獲取伺服器端的ip位址,若伺服器有多個位址,則只要埠號一致,就可以從不同ip位址接收資料

網路程式設計的第一件事就是呼叫socket函式建立套接字

#include int socket(int domain, int type, int protocol);

// 成功返回檔案描述符, 失敗返回-1

domain:套接字中使用的協議族(protocol family)資訊

type:     套接字的資料傳輸型別

protocol:計算機間通訊使用的協議

bind函式負責把初始化的位址資訊分配給套接字

#include int bind(int sockfd, struct sockaddr * myaddr, socklen_t addrlen);

// 成功返回0,失敗返回-1

TCP IP 第1章 理解網路程式設計和套接字

1.socket函式建立套接字。2.呼叫bind函式給套接字分配ip位址和埠號。3.呼叫listen函式轉為可接受請求狀態。4.呼叫accept函式受理連線請求 include include include include include include using namespace std v...

套接字程式設計基礎 Unix網路程式設計第3章總結

1.套接字位址結構 以下是其posix定義 struct in addr struct sockaddr in在rhel5中,in addr t是無符號32位整數,in.h檔案中包含 typedef unit32 t in addr t posix規範只有sin family,sin port和si...

第17章 套接字程式設計

1.使用tcp從伺服器獲取資料 end.2.乙個簡單的tcp伺服器 socket server.erl module socket server export start nano server 0,loop 1,nano client eval 1 start nano server gen tc...