Socket編程筆記一:網(wǎng)絡(luò)應(yīng)用程序的概念

 

網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì),最基本的兩個(gè)問(wèn)題是:通信的進(jìn)程如何相互識(shí)別;雙方采用怎樣的方式進(jìn)行聯(lián)系

什么是網(wǎng)絡(luò)應(yīng)用程序?

 

應(yīng)用程序可以簡(jiǎn)單地分為:

無(wú)通信應(yīng)用程序

通信的應(yīng)用程序(網(wǎng)絡(luò)應(yīng)用程序

 

進(jìn)程間通信的問(wèn)題可以分為兩種:

單擊系統(tǒng)的進(jìn)程通信。消息、信號(hào)量、共享存儲(chǔ)區(qū)。

不同系統(tǒng)的進(jìn)程。網(wǎng)絡(luò)通信協(xié)議。

 

網(wǎng)絡(luò)應(yīng)用程序的識(shí)別問(wèn)題

 

半相關(guān):為了唯一地標(biāo)識(shí)網(wǎng)絡(luò)中通信的一個(gè)進(jìn)程,即通信一方,就要使用一個(gè)如下的三元組:

(本地協(xié)議,本地IP地址,本地端口號(hào))

相關(guān):一個(gè)五元組可以唯一標(biāo)識(shí)網(wǎng)絡(luò)中兩個(gè)通信的進(jìn)程或一條連接

(協(xié)議,本地IP地址,本地端口號(hào),遠(yuǎn)程IP地址,遠(yuǎn)程端口號(hào))

 

網(wǎng)絡(luò)程序聯(lián)系的模型:客戶/服務(wù)器

 

服務(wù)器的分類:

串行服務(wù)器:服務(wù)器只有一個(gè)進(jìn)程用串行的方式對(duì)客戶地請(qǐng)求提供服務(wù);

并發(fā)服務(wù)器:服務(wù)器可以為分別每個(gè)客戶請(qǐng)求創(chuàng)建進(jìn)程或線程并提供服務(wù);

 

服務(wù)器特點(diǎn):

1.          服務(wù)進(jìn)程一般在啟動(dòng)后就一直運(yùn)行,以等待客戶請(qǐng)求的到來(lái),除非服務(wù)被禁止或執(zhí)行強(qiáng)迫終止服務(wù)程序。

2.          服務(wù)器方進(jìn)程使用的是眾所周知的端口,否則客戶無(wú)法知道提供服務(wù)的端口

3.          服務(wù)器方通常擁有較多的資源。

4.          服務(wù)器方進(jìn)程可以并行處理多個(gè)客戶的請(qǐng)求,但可以同時(shí)處理的客戶請(qǐng)求數(shù)目是有一定限制的 。

5.          服務(wù)器方在通信時(shí)屬于被動(dòng)的一方。

 

客戶方:

1.          需要服務(wù)時(shí)向服務(wù)器提出請(qǐng)求,請(qǐng)求的服務(wù)得到滿足并完成處理任務(wù)后,就終止客戶程序的執(zhí)行。

2.          使用向系統(tǒng)申請(qǐng)的臨時(shí)端口與服務(wù)器方進(jìn)程進(jìn)行通信。

3.          擁有相對(duì)較少的資源。

4.          客戶方在通信時(shí)屬于主動(dòng)的一方。

 

 

 

 

Socket編程筆記二:Tcp/ip應(yīng)用程序工作模型與網(wǎng)絡(luò)編程接口

Tcp/ip協(xié)議的核心內(nèi)容被封裝到操作系統(tǒng)中,系統(tǒng)提供網(wǎng)絡(luò)編程接口Windows Sockets用于網(wǎng)絡(luò)程序設(shè)計(jì)。

Tcp/ip應(yīng)用程序工作模型

 

客戶應(yīng)用程序  --------------------------服務(wù)器應(yīng)用程序

     |                            |

網(wǎng)絡(luò)編程接口-  --------------------------網(wǎng)絡(luò)編程接口

     |                            |

TCP/IP核心協(xié)議 ------------------------ TCP/IP核心協(xié)議

     |                            |

物理傳輸介質(zhì)  -------------------------- 物理傳輸介質(zhì)

 

用戶在進(jìn)行TCP/IP程序設(shè)計(jì)時(shí),最關(guān)鍵的問(wèn)題是要熟悉所用平臺(tái)提供的網(wǎng)絡(luò)編程界面API。

 

網(wǎng)絡(luò)編程接口Winsock

 

Winsock的版本:

1.         Winsock1.1 ;16位,由Winsock.dll支持

2.         Winsock2.2 ;32位,由Wsock32.dl支持l

 

WinsockAPI函數(shù)分類:

1.         BSDSoketUnix)相兼容的基本函數(shù)

2.         網(wǎng)絡(luò)數(shù)據(jù)信息檢索函數(shù)

3.         Windows專用擴(kuò)展函數(shù)

 

Socket編程筆記三:套接口的概念與其編程原理

 

套接口Soket

 

程序A——套接口——網(wǎng)管軟件——網(wǎng)卡      網(wǎng)卡——網(wǎng)管軟件——套接口——程序B

 

若不考慮通信過(guò)程中的網(wǎng)絡(luò)接口卡和傳輸介質(zhì)等,則網(wǎng)絡(luò)通信的過(guò)程就是由數(shù)據(jù)的發(fā)送者將要發(fā)送的信息寫入一個(gè)套接口,再通過(guò)中間環(huán)節(jié)將信息傳輸?shù)浇邮斩说奶捉涌谥?,然后就可以由接收端的?yīng)用程序?qū)⑿畔奶捉涌谥腥〕?u>。因此兩個(gè)程序之間的數(shù)據(jù)傳輸要通過(guò)套接口來(lái)完成。

套接口的本質(zhì):就是通信過(guò)程中所要使用的一些緩沖區(qū)及一些相關(guān)的數(shù)據(jù)結(jié)構(gòu)。

 

套接口的分類:

1.         流式套接口(SOCK_STREAM;Tcp協(xié)議實(shí)現(xiàn)字符流的傳輸

2.         數(shù)據(jù)套接口(SOCK_DGRAM;UDP協(xié)議

3.         原始套接口(SOCK_RAW);底層協(xié)議

 

 

套接口的編程原理

 

服務(wù)器

Socket()開(kāi)啟服務(wù)——bind()綁定端口——listen()監(jiān)聽(tīng)請(qǐng)求——accept()接受請(qǐng)求——recv()接收數(shù)據(jù)——send()發(fā)送數(shù)據(jù)——closesocket()關(guān)閉套接口

客戶方

Socket()請(qǐng)求服務(wù)——connect()連接服務(wù)器——closesocket()關(guān)閉套接口

 

錯(cuò)誤處理機(jī)制

 

不成功的Winsock函數(shù)調(diào)用返回的最常見(jiàn)的值是宏定義SOCKET _ERROR,在 Winsock的頭文件中( Winsock2.h),它的數(shù)值是-1,實(shí)際上如果調(diào)用一個(gè)Winsock函數(shù)時(shí)發(fā)生了錯(cuò)誤,則應(yīng)該進(jìn)一步使用WSAGetLastError()函數(shù),以獲得對(duì)這一錯(cuò)誤詳細(xì)說(shuō)明。該函數(shù)的使用非常簡(jiǎn)單,格式如下:

  Int WSAGetLastError(void)

這是一個(gè)無(wú)參函數(shù),調(diào)用時(shí)返回最新發(fā)生的網(wǎng)絡(luò)錯(cuò)誤代碼。

 

網(wǎng)絡(luò)字節(jié)順序

 

小序在前:在起始地址處存放整數(shù)的低序號(hào)字節(jié)。主機(jī)字節(jié)順序。

大序在前:在起始地址處存放整數(shù)的高序號(hào)字節(jié)。網(wǎng)絡(luò)字節(jié)順序

Winsock中有一系列的函數(shù)可用于多字節(jié)的轉(zhuǎn)換,把它們從主機(jī)字節(jié)順序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。

htonl()                ntohl()

WSAHtonl()            WSANtohl()

htons()                ntohs()

WSAHtons()            WSANtohs()