Socket編程筆記一:網絡應用程序的概念
網絡應用程序設計,最基本的兩個問題是:①通信的進程如何相互識別;②雙方采用怎樣的方式進行聯系。
什么是網絡應用程序?
應用程序可以簡單地分為:
①無通信應用程序
②通信的應用程序(網絡應用程序)
進程間通信的問題可以分為兩種:
①單擊系統的進程通信。消息、信號量、共享存儲區。
②不同系統的進程。網絡通信協議。
網絡應用程序的識別問題
半相關:為了唯一地標識網絡中通信的一個進程,即通信一方,就要使用一個如下的三元組:
(本地協議,本地IP地址,本地端口號)
相關:一個五元組可以唯一標識網絡中兩個通信的進程或一條連接
(協議,本地IP地址,本地端口號,遠程IP地址,遠程端口號)
網絡程序聯系的模型:客戶/服務器
服務器的分類:
串行服務器:服務器只有一個進程用串行的方式對客戶地請求提供服務;
并發服務器:服務器可以為分別每個客戶請求創建進程或線程并提供服務;
服務器特點:
1. 服務進程一般在啟動后就一直運行,以等待客戶請求的到來,除非服務被禁止或執行強迫終止服務程序。
2. 服務器方進程使用的是眾所周知的端口,否則客戶無法知道提供服務的端口
3. 服務器方通常擁有較多的資源。
4. 服務器方進程可以并行處理多個客戶的請求,但可以同時處理的客戶請求數目是有一定限制的 。
5. 服務器方在通信時屬于被動的一方。
客戶方:
1. 在需要服務時向服務器提出請求,請求的服務得到滿足并完成處理任務后,就終止客戶程序的執行。
2. 使用向系統申請的臨時端口與服務器方進程進行通信。
3. 擁有相對較少的資源。
4. 客戶方在通信時屬于主動的一方。
Socket編程筆記二:Tcp/ip應用程序工作模型與網絡編程接口
Tcp/ip協議的核心內容被封裝到操作系統中,系統提供網絡編程接口Windows Sockets用于網絡程序設計。
Tcp/ip應用程序工作模型
客戶應用程序 --------------------------服務器應用程序
| |
網絡編程接口- --------------------------網絡編程接口
| |
TCP/IP核心協議 ------------------------ TCP/IP核心協議
| |
物理傳輸介質 -------------------------- 物理傳輸介質
用戶在進行TCP/IP程序設計時,最關鍵的問題是要熟悉所用平臺提供的網絡編程界面API。
網絡編程接口Winsock
Winsock的版本:
1. Winsock1.1 ;16位,由Winsock.dll支持
2. Winsock2.2 ;32位,由Wsock32.dl支持l
WinsockAPI函數分類:
1. 與BSDSoket(Unix)相兼容的基本函數
2. 網絡數據信息檢索函數
3. Windows專用擴展函數
Socket編程筆記三:套接口的概念與其編程原理
套接口Soket
程序A——套接口——網管軟件——網卡 網卡——網管軟件——套接口——程序B
若不考慮通信過程中的網絡接口卡和傳輸介質等,則網絡通信的過程就是由數據的發送者將要發送的信息寫入一個套接口,再通過中間環節將信息傳輸到接收端的套接口中,然后就可以由接收端的應用程序將信息從套接口中取出。因此兩個程序之間的數據傳輸要通過套接口來完成。
套接口的本質:就是通信過程中所要使用的一些緩沖區及一些相關的數據結構。
套接口的分類:
1. 流式套接口(SOCK_STREAM);Tcp協議實現字符流的傳輸
2. 數據套接口(SOCK_DGRAM);UDP協議
3. 原始套接口(SOCK_RAW);底層協議
套接口的編程原理
服務器
Socket()開啟服務——bind()綁定端口——listen()監聽請求——accept()接受請求——recv()接收數據——send()發送數據——closesocket()關閉套接口
客戶方
Socket()請求服務——connect()連接服務器——closesocket()關閉套接口
錯誤處理機制
不成功的Winsock函數調用返回的最常見的值是宏定義SOCKET _ERROR,在 Winsock的頭文件中(如 Winsock2.h),它的數值是-1,實際上如果調用一個Winsock函數時發生了錯誤,則應該進一步使用WSAGetLastError()函數,以獲得對這一錯誤詳細說明。該函數的使用非常簡單,格式如下:
Int WSAGetLastError(void)
這是一個無參函數,調用時返回最新發生的網絡錯誤代碼。
網絡字節順序
小序在前:在起始地址處存放整數的低序號字節。主機字節順序。
大序在前:在起始地址處存放整數的高序號字節。網絡字節順序。
在Winsock中有一系列的函數可用于多字節的轉換,把它們從主機字節順序轉換成網絡字節順序。
htonl() ntohl()
WSAHtonl() WSANtohl()
htons() ntohs()
WSAHtons() WSANtohs()