青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Jiang's C++ Space

創作,也是一種學習的過程。

   :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::

【20060407發表于blog.csdn.net,20090928重編輯】

(博主:此為轉載文章,出處已經記不清,內容有些泛泛而談,僅供參考)

一、客戶機/服務器模式

在TCP/IP網絡中兩個進程間的相互作用的主機模式是客戶機/服務器模式(Client/Server model)。該模式的建立基于以下兩點:
1、非對等作用;
2、通信完全是異步的。
客戶機/服務器模式在操作過程中采取的是主動請示方式。

服務器方要先啟動,并根據請示提供相應服務,過程如下:
1、打開一通信通道并告知本地主機,它愿意在某一個公認地址上接收客戶請求。
2、等待客戶請求到達該端口。
3、接收到重復服務請求,處理該請求并發送應答信號。
4、返回第二步,等待另一客戶請求
5、關閉服務器。

然后死客戶方:
1、打開一通信通道,并連接到服務器所在主機的特定端口。
2、向服務器發送服務請求報文,等待并接收應答;繼續提出請求……
3、請求結束后關閉通信通道并終止。

二、基本套接字

為了更好說明套接字編程原理,給出幾個基本的套接字,在以后的篇幅中會給出更詳細的使用說明。

1、創建套接字——socket()
功能:使用前創建一個新的套接字
格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);
af: 通信發生的區域
type: 要建立的套接字類型
procotol: 使用的特定協議

2、指定本地地址——bind()
功能:將套接字地址與所創建的套接字號聯系起來。
格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);
s: 是由socket()調用返回的并且未作連接的套接字描述符(套接字號)。
其它:沒有錯誤,bind()返回0,否則SOCKET_ERROR

地址結構說明:

struct sockaddr_in
{
 
short sin_family;     //AF_INET
 u_short sin_port;     //16位端口號,網絡字節順序
 struct in_addr sin_addr; //32位IP地址,網絡字節順序
 char sin_zero[8];     //保留
}

3、建立套接字連接——connect()和accept()
功能:共同完成連接工作
格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);
格式:SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);
(參數同上)

4、監聽連接——listen()
功能:用于面向連接服務器,表明它愿意接收連接。
格式:int PASCAL FAR listen(SOCKET s, int backlog);

5、數據傳輸——send()與recv()
功能:數據的發送與接收
格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);
格式:int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);
buf:指向存有傳輸數據的緩沖區的指針。

6、多路復用——select()
功能:用來檢測一個或多個套接字狀態。
格式:int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds,
 fd_set FAR * exceptfds,const struct timeval FAR * timeout);
readfds:指向要做讀檢測的指針
writefds:指向要做寫檢測的指針
exceptfds:指向要檢測是否出錯的指針
timeout:最大等待時間

7、關閉套接字——closesocket()
功能:關閉套接字s
格式:BOOL PASCAL FAR closesocket(SOCKET s);

三、典型過程圖

2.1 面向連接的套接字的系統調用時序圖

2.2 無連接協議的套接字調用時序圖

2.3 面向連接的應用程序流程圖

四、WinSock簡介

Windows Sockets 是從 Berkeley Sockets 擴展而來的,其在繼承 Berkeley Sockets 的基礎上,又進行了新的擴充。這些擴充主要是提供了一些異步函數,并增加了符合WINDOWS消息驅動特性的網絡事件異步選擇機制。

Windows Sockets由兩部分組成:開發組件和運行組件。
開發組件:Windows Sockets 實現文檔、應用程序接口(API)引入庫和一些頭文件。
運行組件:Windows Sockets 應用程序接口的動態鏈接庫(WINSOCK.DLL)。

五、WinSock主要擴充說明

1、異步選擇機制
Windows Sockets 的異步選擇函數提供了消息機制的網絡事件選擇,當使用它登記網絡事件發生時,應用程序相應窗口函數將收到一個消息,消息中指示了發生的網絡事件,以及與事件相關的一些信息。Windows Sockets 提供了一個異步選擇函數 WSAAsyncSelect(),用它來注冊應用程序感興趣的網絡事件,當這些事件發生時,應用程序相應的窗口函數將收到一個消息。

函數結構如下:
int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);
hWnd:窗口句柄
wMsg:需要發送的消息
lEvent:事件(以下為事件的內容)

事件值含義:
FD_READ 期望在套接字上收到數據(即讀準備好)時接到通知
FD_WRITE 期望在套接字上可發送數據(即寫準備好)時接到通知
FD_OOB 期望在套接字上有帶外數據到達時接到通知
FD_ACCEPT 期望在套接字上有外來連接時接到通知
FD_CONNECT 期望在套接字連接建立完成時接到通知
FD_CLOSE 期望在套接字關閉時接到通知

例如:我們要在套接字讀準備好或寫準備好時接到通知,語句如下:
rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);
如果我們需要注銷對套接字網絡事件的消息發送,只要將 lEvent 設置為0

2、異步請求函數
在 Berkeley Sockets 中請求服務是阻塞的,WINDOWS SICKETS 除了支持這一類函數外,還增加了相應的異步請求函數——WSAAsyncGetXByY。

3、阻塞處理方法
Windows Sockets 為了實現當一個應用程序的套接字調用處于阻塞時,能夠放棄CPU讓其它應用程序運行,它在調用處于阻塞時便進入一個叫“HOOK”的例程,此例程負責接收和分配WINDOWS消息,使得其它應用程序仍然能夠接收到自己的消息并取得控制權。

WINDOWS 是非搶先的多任務環境,即若一個程序不主動放棄其控制權,別的程序就不能執行。因此在設計Windows Sockets 程序時,盡管系統支持阻塞操作,但還是反對程序員使用該操作。但由于 SUN 公司下的 Berkeley Sockets 的套接字默認操作是阻塞的,WINDOWS 作為移植的 SOCKETS 也不可避免對這個操作支持。

在Windows Sockets 實現中,對于不能立即完成的阻塞操作做如下處理:DLL初始化→循環操作。在循環中,它發送任何 WINDOWS 消息,并檢查這個 Windows Sockets 調用是否完成,在必要時,它可以放棄CPU讓其它應用程序執行(當然使用超線程的CPU就不會有這個麻煩了^_^)。我們可以調用 WSACancelBlockingCall() 函數取消此阻塞操作。

在 Windows Sockets 中,有一個默認的阻塞處理例程 BlockingHook() 簡單地獲取并發送 WINDOWS 消息。如果要對復雜程序進行處理,Windows Sockets 中還有 WSASetBlockingHook() 提供用戶安裝自己的阻塞處理例程能力;與該函數相對應的則是 WSAUnhookBlockingHook(),它用于刪除先前安裝的任何阻塞處理例程,并重新安裝默認的處理例程。請注意,設計自己的阻塞處理例程時,除了函數 WSACancelBlockingHook() 之外,它不能使用其它的 Windows Sockets API 函數。在處理例程中調用 WSACancelBlockingHook()函數將取消處于阻塞的操作,它將結束阻塞循環。

4、出錯處理

Windows Sockets 為了和以后多線程環境(WINDOWS/UNIX)兼容,它提供了兩個出錯處理函數來獲取和設置當前線程的最近錯誤號。(WSAGetLastEror()和WSASetLastError())

5、啟動與終止

使用函數 WSAStartup() 和 WSACleanup() 啟動和終止套接字。

六、Windows Sockets網絡程序設計核心

我們終于可以開始真正的 Windows Sockets 網絡程序設計了。不過我們還是先看一看每個 Windows Sockets 網絡程序都要涉及的內容。讓我們一步步慢慢走。

1、啟動與終止

在所有Windows Sockets函數中,只有啟動函數WSAStartup()和終止函數WSACleanup()是必須使用的。啟動函數必須是第一個使用的函數,而且它允許指定 Windows Sockets API 的版本,并獲得 SOCKETS的特定的一些技術細節。本結構如下:

int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

其中 wVersionRequested 保證 SOCKETS 可正常運行的 DLL 版本,如果不支持,則返回錯誤信息。我們看一下下面這段代碼,看一下如何進行 WSAStartup() 的調用:

WORD wVersionRequested; // 定義版本信息變量
WSADATA wsaData; //定義數據信息變量
int err; //定義錯誤號變量
wVersionRequested = MAKEWORD(1,1);//給版本信息賦值
err = WSAStartup(wVersionRequested, &wsaData);//給錯誤信息賦值
if(err!=0)
{
  
return;//告訴用戶找不到合適的版本
}
//確認 Windows Sockets DLL 支持 1.1 版本
//DLL 版本可以高于 1.1
//系統返回的版本號始終是最低要求的 1.1,即應用程序與DLL 中可支持的最低版本號
if(LOBYTE(wsaData.wVersion)!= 1|| HIBYTE(wsaData.wVersion)!=1)
{
  WSACleanup();
//告訴用戶找不到合適的版本
  return;
}
//Windows Sockets DLL 被進程接受,可以進入下一步操作

關閉函數使用時,任何打開并已連接的 SOCK_STREAM 套接字被復位,但那些已由 closesocket() 函數關閉的但仍有未發送數據的套接字不受影響,未發送的數據仍將被發送。程序運行時可能會多次調用 WSAStartuo() 函數,但必須保證每次調用時的 wVersionRequested 的值是相同的。

2、異步請求服務

Windows Sockets 除支持 Berkeley Sockets 中同步請求,還增加了了一類異步請求服務函數 WSAAsyncGerXByY()。該函數是阻塞請求函數的異步版本。應用程序調用它時,由 Windows Sockets DLL 初始化這一操作并返回調用者,此函數返回一個異步句柄,用來標識這個操作。當結果存儲在調用者提供的緩沖區,并且發送一個消息到應用程序相應窗口。常用結構如下:

HANDLE taskHnd;
char hostname="rs6000";
taskHnd 
= WSAAsyncBetHostByName(hWnd,wMsg,hostname,buf,buflen);  

需要注意的是,由于 Windows 的內存對像可以設置為可移動和可丟棄,因此在操作內存對象是,必須保證 WIindows Sockets DLL 對象是可用的。

3、異步數據傳輸

使用 send() 或 sendto() 函數來發送數據,使用 recv() 或recvfrom() 來接收數據。Windows Sockets 不鼓勵用戶使用阻塞方式傳輸數據,因為那樣可能會阻塞整個 Windows 環境。下面我們看一個異步數據傳輸實例。

假設套接字 s 在連接建立后,已經使用了函數 WSAAsyncSelect() 在其上注冊了網絡事件 FD_READ 和 FD_WRITE,并且 wMsg 值為 UM_SOCK,那么我們可以在 Windows 消息循環中增加如下的分支語句:

case UM_SOCK:
  
switch(lParam)
  {
  
case FD_READ:
    len 
= recv(wParam,lpBuffer,length,0);
    
break;
  
case FD_WRITE:
    
while(send(wParam,lpBuffer,len,0)!=SOCKET_ERROR)
    
break;
  }
break

4、出錯處理

Windows 提供了一個函數來獲取最近的錯誤碼 WSAGetLastError(),推薦的編寫方式如下:

len = send (s,lpBuffer,len,0);
if((len==SOCKET_ERROR)&&(WSAGetLastError()==WSAWOULDBLOCK)){}

 

posted on 2009-09-28 11:09 Jiang Guogang 閱讀(806) 評論(0)  編輯 收藏 引用 所屬分類: Windows Programming
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩午夜在线观看视频| 亚洲少妇诱惑| 亚洲国产日韩欧美一区二区三区| 亚洲全部视频| 国产一区二区三区在线观看免费| 亚洲日韩成人| 久久婷婷亚洲| 欧美一区二粉嫩精品国产一线天| 亚洲一区欧美| 99re6这里只有精品| 一区二区三区精品在线| 亚洲精品欧洲精品| 亚洲理伦电影| 亚洲蜜桃精久久久久久久| 亚洲精品一区二区三区在线观看| 亚洲第一网站| 亚洲国产高清aⅴ视频| 亚洲第一福利社区| 亚洲三级免费| 亚洲一区在线观看视频 | 美腿丝袜亚洲色图| 久久精品国产亚洲aⅴ| 国产视频不卡| 欧美va亚洲va国产综合| 久久免费午夜影院| 免费在线观看精品| 欧美日韩国产综合视频在线观看 | 亚洲桃色在线一区| 久久全国免费视频| 久久久亚洲成人| 蜜桃av久久久亚洲精品| 亚洲精品一线二线三线无人区| 亚洲电影专区| 中文久久乱码一区二区| 久久精品最新地址| 欧美精品成人一区二区在线观看 | 日韩天堂在线观看| 欧美在线视屏| 欧美日精品一区视频| 国产一区二区三区四区| 亚洲日韩欧美视频一区| 亚洲一区二区三区涩| 久久婷婷国产综合精品青草| 亚洲国产精品成人va在线观看| 亚洲一区二区日本| 蜜臀久久久99精品久久久久久| 国产精品久久久久久久久久直播 | 欧美亚洲在线| 欧美国产一区二区在线观看| 亚洲自拍三区| 欧美日韩一区二区在线播放| 伊人久久成人| 欧美在线精品免播放器视频| 亚洲精品之草原avav久久| 99re66热这里只有精品3直播| 久久人体大胆视频| 亚洲一区二区三区久久| 欧美日韩精品一区二区三区| 一本色道**综合亚洲精品蜜桃冫| 久久视频免费观看| 国产伦精品一区二区三区高清| 亚洲激情一区| 国产精品福利久久久| 一区二区欧美在线| 久久网站热最新地址| 欧美一级免费视频| 亚洲精品一区二区三区99| 国产网站欧美日韩免费精品在线观看| 日韩网站免费观看| 欧美成人精精品一区二区频| 久久狠狠婷婷| 国产精品一区二区久久久| 一区二区三区视频免费在线观看| 亚洲高清一区二| 久久综合久久久| 亚洲黄色在线看| 欧美福利一区二区三区| 女同性一区二区三区人了人一 | 国产无遮挡一区二区三区毛片日本| 亚洲永久免费精品| 一二三区精品福利视频| 欧美性猛交xxxx免费看久久久 | 麻豆成人精品| 久久久国产一区二区三区| 国内精品嫩模av私拍在线观看 | 久久久青草婷婷精品综合日韩| 欧美一区91| 亚洲电影免费观看高清完整版| 欧美韩国在线| 欧美极品色图| 午夜精品一区二区在线观看| 亚洲综合欧美日韩| 亚洲盗摄视频| 亚洲综合99| 亚洲清纯自拍| 亚洲影院高清在线| 亚洲电影在线| 亚洲网址在线| 亚洲精品国久久99热| 亚洲一区二区三区免费观看| 亚洲二区免费| 亚洲男人的天堂在线观看| 在线看成人片| 一本色道久久综合亚洲精品高清 | 亚洲毛片一区| 亚洲免费观看在线视频| 国产女人18毛片水18精品| 亚洲第一精品久久忘忧草社区| 欧美日韩免费视频| 久久精品国产清自在天天线| 久久久亚洲精品一区二区三区| 亚洲精选在线观看| 欧美韩日亚洲| 欧美日韩在线视频一区| 欧美一区二区视频在线| 欧美中文字幕| 亚洲欧美日韩在线观看a三区| 欧美国产日本韩| 蜜臀a∨国产成人精品| 欧美在线综合| 亚洲欧美久久久| 欧美亚洲免费| 99精品视频免费在线观看| 久久久久久久精| 国产精品日韩在线一区| 久久精品国产精品| 午夜在线电影亚洲一区| 国产日韩一区二区三区在线播放| 亚洲精品欧美专区| 久久米奇亚洲| 日韩视频三区| 在线成人国产| 最新精品在线| 国产精品精品视频| 久久久精品日韩| 国产一区二区三区在线观看视频| 久久米奇亚洲| 久热re这里精品视频在线6| 在线免费日韩片| 亚洲韩国青草视频| 一本色道久久综合精品竹菊| 亚洲精品免费看| 国产精品婷婷午夜在线观看| 久久亚洲私人国产精品va| 久久尤物视频| 国产伦精品一区二区三区高清| 一区二区三区欧美成人| 国产精品亚洲综合一区在线观看| 麻豆国产va免费精品高清在线| 久久裸体艺术| 亚洲性av在线| 国产精品美女久久久免费| 欧美 日韩 国产在线 | 免费观看国产成人| 日韩亚洲精品电影| 亚洲欧美亚洲| 欧美日韩免费在线视频| 亚洲九九九在线观看| 狠狠色2019综合网| 亚洲精品乱码视频| 韩国av一区二区| av不卡在线| 国产一区二区日韩| 亚洲久色影视| 亚洲国产精品高清久久久| 亚洲一区二区免费| 亚洲精品免费看| 久久经典综合| 亚洲一级二级| 亚洲一区日韩在线| 久久精品免费| 欧美午夜欧美| 亚洲国产日本| 一区二区三区自拍| 欧美在线视屏| 亚洲国产日韩欧美综合久久| 亚洲一二三区精品| 91久久精品日日躁夜夜躁国产| 亚洲图片欧洲图片日韩av| 久久九九国产| 亚洲视频碰碰| 夜夜嗨av一区二区三区| 一本一本久久a久久精品牛牛影视| 亚洲欧洲一区二区在线播放| 亚洲私人影院在线观看| 美女精品网站| 一区二区动漫| 久久综合久久综合久久综合| 日韩视频亚洲视频| 亚洲免费高清| 黄色欧美日韩| 国产伦精品一区二区三区视频黑人 | 国产精品你懂的在线欣赏| 牛牛精品成人免费视频| 亚洲欧美日韩综合| 欧美三级资源在线| 免费日韩视频| 久久精品论坛| 亚洲视频999| 亚洲国产专区校园欧美|