套接字網絡編程基礎(二)

#socket 套接字#

套接字應用程序編程接口是網絡應用程序通過網絡協議棧進行通信時所使用的接口,即應用程序與協議棧軟件之間的接口,簡稱套接字編程接口(Socket API)。它定義了應用程序與協議棧軟件進行交互時可以使用的一組操作,決定了應用程序使用協議棧的方式、應用程序所能實現的功能、以及開發具有這些功能的程序的難度

這裏寫圖片描述

##套接字概念##

  1. 從套接字所處的地位來講,套接字上聯應用進程,下聯網絡協議棧,是應用程序通過網絡協議棧進行通信的接口,是應用程序與網絡協議棧進行交互的接口
  2. 從實現的角度來講,非常複雜。套接字是一個複雜的軟件機構,包含了一定的數據結構,包含許多選項,由操作系統內核管理
  3. 從使用的角度來講,非常簡單。對於套接字的操作形成了一種網絡應用程序的編程接口(API)

##套接字特點##

###通信域 ###
通信域:是一個計算機網絡的範圍,在這個範圍中,所有的計算機使用同一種網絡體系結構,使用同一種協議棧

套接字存在於通信域中,通信域是爲了處理一般的進程通過套接字通信而引入的一種抽象概念,套接字通常只和同一域中的套接字交換數據。如果數據交換要穿越域的邊界,就一定要執行某種解釋程序。現在,僅僅針對Internet域,並且使用Internet協議簇來通信

###套接字類型###
####數據報套接字####
這裏寫圖片描述
**數據報套接字(Datagram Socket)**提供無連接的不保證可靠的獨立的數據報傳輸服務。在Internet通信域中,數據報套接字使用UDP數據報協議形成的進程間通路,具有UDP協議爲上層所提供的服務的所有特點。
####流式套接字####
這裏寫圖片描述
**流式套接字(Stream Socket)**提供雙向的、有序的、無重複的、無記錄邊界的可靠的數據流傳輸服務。在Internet通信域中,流式套接字使用TCP協議形成的進程間通路,具有TCP協議爲上層所提供的服務的所有特點,在使用流式套接字傳輸數據之前,必須在數據的發送端和接收端之間建立連接。
####原始式套接字####
**原始式套接字(Raw Socket)**允許對較低層次的協議,如IP、ICMP直接訪問,用於檢驗新的協議的實現。

##套接字使用的數據類型和相關問題##

###存儲套接字地址結構體###

  1. SOCKADDR Structure
struct sockaddr { 
   unsigned short sa_family; //Socket address family.
   char sa_data[14]; //Maximum size of all the different socket address structures.
};

VS文檔介紹:

The SOCKADDR structure is used to store an Internet Protocol (IP) address for a machine participating in a Windows Sockets communication

要求

Header: winsock2.h

2.SOCKADDR Structure

struct sockaddr_in{ 
   short sin_family; //Address family (must be AF_INET).
   unsigned short sin_port; //IP port.
   struct in_addr sin_addr; //IP address.
   char sin_zero[8]; //Padding to make structure the same size as SOCKADDR.
};

VS文檔介紹:

This is the form of the SOCKADDR structure specific to the Internet address family and can be cast to SOCKADDR.

The IP address component of this structure is of type IN_ADDR. The IN_ADDR structure is defined in Windows Sockets header file WINSOCK.H as follows:

struct in_addr {
	union {
			struct{
					unsigned char s_b1,
					s_b2,
					s_b3,
					s_b4;
			} S_un_b;
			struct {
					unsigned short s_w1,
					s_w2;
			} S_un_w;
			unsigned long S_addr;
	} S_un;
};

要求:

Header: winsock2.h

###本機字節順序和網絡字節順序###

網絡字節順序是TCP/IP規定好的一種數據表示格式,它與具體的CPU類型、操作系統無關,從而可以保證數據在不同主機之間傳輸時能被正確解釋。網絡字節順序採用低位字節排放在內存的低地址端,高位字節排放在內存的高地址端排序方式

本機字節順序具體計算機中的多字節數據存儲順序

網絡應用程序要在不同的計算機中運行,本機字節順序是不同的,但是,網絡字節順序是相同的。所以,應用程序在編程的時候,在把IP地址和端口號裝入套接字的時候,應當把它們從本機字節順序轉換爲網絡字節順序;相反,在本機輸出時,應將它們從網絡字節順序轉換爲本機字節順序

####相關轉化函數####

htons() 短整數本機順序轉換爲網絡順序,用於端口號
htonl() 長整數本機順序轉換爲網絡順序,用於IP地址
ntohs()短整數網絡順序轉換爲本機順序,用於端口號
ntohl() 長整數網絡順序轉化爲本機順序,用於IP地址

這四個函數將被轉換的數值作爲函數的參數,函數返回值是轉換後的結果

####點分十進制的IP地址轉換####

在因特網中,IP地址常常用點分十進制的表示方法,但在套接字中,IP地址是無符號的長整型數,套接字編程接口設置了兩個函數,專門用於兩種形式的IP地址的轉換

unsigned long inet_addr(const char* cp)

入口參數cp:點分十進制形式的IP地址
返回值: 網絡字節順序的IP地址,是無符號的長整數

char * inet_ntoa(struct in_addr in)//結構體轉化爲IP地址

入口參數in:包含長整型IP地址的 in_addr 結構變量
返回值: 指向點分十進制IP地址的字符串的指針

####域名服務####

struct hostent* gethostbyname(const char * name)

入口參數:是站點的主機域名字符串,
返回值: 是指向hostent 結構的指針

hostent結構包含主機名、主機別名數組、返回地址的類型(一般是AF-INET)、地址長度的字節數、已符合網絡字節順序的主機網絡地址等

//以上內容大部分摘自《網絡編程實用教程(第三版)》 編者 段利國 劉金江 倪天偉 葉樹華
//侵權必刪
//僅供參考
//windows網絡編程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章