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. 與BSDSoket(Unix)相兼容的基本函數(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()