• <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>

            lantionzy

            coding
            posts - 10, comments - 39, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
               注:本系列文章適合初學(xué)網(wǎng)絡(luò)編程的讀者
               
               網(wǎng)絡(luò)程序的實(shí)現(xiàn)可以有很多方式,Windows Socket就是其中一種比較簡(jiǎn)單的方法。socket是連接應(yīng)用程序與網(wǎng)絡(luò)驅(qū)動(dòng)程序的橋梁,socket在應(yīng)用程序中創(chuàng)建,通過(guò)綁定操作與驅(qū)動(dòng)程序建立關(guān)系。此后,應(yīng)用程序送給socket的數(shù)據(jù),由socket交給驅(qū)動(dòng)程序向網(wǎng)絡(luò)上發(fā)送出去。計(jì)算機(jī)從網(wǎng)絡(luò)上收到與該socket綁定的IP地址和端口號(hào)相關(guān)的數(shù)據(jù)后,由驅(qū)動(dòng)程序交給socket,應(yīng)用程序便可從該socket中提取接收到的數(shù)據(jù)。
               在TCP/IP網(wǎng)絡(luò)應(yīng)用中,通信的兩個(gè)進(jìn)程間相互作用的主要是(client/server)模式,即客戶(hù)向服務(wù)器提出請(qǐng)求,服務(wù)器接收到請(qǐng)求后,提供相應(yīng)的服務(wù)。
               下面通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)講述基于TCP的socket編程的通信流程。其中服務(wù)器端程序?qū)崿F(xiàn)代碼TCPSrv.cpp如下:
            Server
               在這段代碼中,首先定義了一個(gè)WORD類(lèi)型的變量:wVersionRequested,用來(lái)保存WinSocl庫(kù)的版本號(hào),接著調(diào)用MAKEWORD宏創(chuàng)建一個(gè)包含了請(qǐng)求版本號(hào)的WORD值,之后調(diào)用WSAStartup函數(shù)加載套接字庫(kù),如果其返回值不等于0 ,則程序退出。接下來(lái)判斷wsaData.wVersion的低字節(jié)和高字節(jié)是否都等于1,如果不是我們請(qǐng)求的版本,那么調(diào)用WSACleanup函數(shù)終止對(duì)Winsock庫(kù)的使用并返回。
               加載套接字庫(kù)后,就可以按照一定流程來(lái)編寫(xiě)實(shí)現(xiàn)代碼了:
               1、創(chuàng)建套接字(socket)
               利用socket函數(shù)創(chuàng)建套接字,對(duì)于它來(lái)說(shuō),第一個(gè)參數(shù)只能是AF_INET或(PF_INET);本例是基于TCP協(xié)議的網(wǎng)絡(luò)程序,需要?jiǎng)?chuàng)建的是流式套接字,因此將socket函數(shù)第二個(gè)參數(shù)設(shè)置為SOCK_STREAM;將其第三個(gè)參數(shù)指定為0。這樣該函數(shù)將根據(jù)地址格式和套接字類(lèi)別,自動(dòng)選擇一個(gè)合適的協(xié)議。
                2、將套接字綁定到一個(gè)本地地址和端口上(bind)
               在SOCKADDR_IN結(jié)構(gòu)體中,除了sa_family成員外,其他成員都是按網(wǎng)絡(luò)字節(jié)順序表示的。因此使用htonl函數(shù)將INADDR_ANY值轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。調(diào)用bind函把套接字sockSrv綁定到本地地址和指定端口上。其第一個(gè)參數(shù)為要綁定的套接字,第二個(gè)需要一個(gè)指針,可以用取地址符來(lái)實(shí)現(xiàn),并且addrSrv變量是SOCKADDR_IN結(jié)構(gòu)體類(lèi)型,而這里需要的是SOCKADDR*類(lèi)型,所以要進(jìn)行強(qiáng)制轉(zhuǎn)換。第三個(gè)參數(shù)是指定地址結(jié)構(gòu)的大小,可以利用sizeof操作符來(lái)獲取。
               3、將套接字設(shè)為監(jiān)聽(tīng)模式(listen),準(zhǔn)備接收客戶(hù)請(qǐng)求。其中l(wèi)isten函數(shù)第二個(gè)參數(shù)是指等待連接隊(duì)列的最大長(zhǎng)度。
               4、等待客戶(hù)請(qǐng)求的到來(lái);當(dāng)請(qǐng)求到來(lái)后,接受連接請(qǐng)求,返回一個(gè)新的對(duì)應(yīng)于此連接的套接字(accept)。
               接下來(lái),需要調(diào)用accept函數(shù)等待并接受客戶(hù)的連接請(qǐng)求。因?yàn)樽鳛榉?wù)器端,它需要不斷的等待客戶(hù)端的連接請(qǐng)求的到來(lái),所以設(shè)計(jì)成一個(gè)死循環(huán)。當(dāng)客戶(hù)端有請(qǐng)求時(shí),該函數(shù)接受請(qǐng)求建立連接,同時(shí)返回一個(gè)相對(duì)于當(dāng)前這個(gè)新連接的一個(gè)套接字描述符,保存于sockConn變量中,然后利用這個(gè)套接字就可以與客戶(hù)端進(jìn)行通信了,而我們先前的套接字仍繼續(xù)監(jiān)聽(tīng)客戶(hù)端的連接請(qǐng)求。
               5、用返回的套接字和客戶(hù)端進(jìn)行通信(send/recv)
               可以調(diào)用send函數(shù)向客戶(hù)端發(fā)送數(shù)據(jù),注意這里使用的套接字是已建立連接的那個(gè)套接字:sockConn,而不是用于監(jiān)聽(tīng)的那個(gè)套接字:addrSrv。使用recv函數(shù)從客戶(hù)端接收數(shù)據(jù)。
               6、返回等待另一個(gè)客戶(hù)請(qǐng)求
               7、關(guān)閉套接字

               上面實(shí)現(xiàn)的服務(wù)器端的程序,下面是客戶(hù)端程序?qū)崿F(xiàn)代碼TCPClient.cpp:
            Client
               對(duì)于客戶(hù)端來(lái)說(shuō),它不需要邦定,可以直接連接服務(wù)器端。

               首先運(yùn)行服務(wù)器端程序,然后再運(yùn)行客戶(hù)端程序,可以看到客戶(hù)端收到了服務(wù)器端返回的信息:Welcome 127.0.0.1 to http://www.shnenglu.com/lantionzy,而服務(wù)器端收到了客戶(hù)端發(fā)送的信息:This is lantionzy。

            剖析網(wǎng)絡(luò)編程(2)-- 基于UDP的的網(wǎng)絡(luò)應(yīng)用程序
            剖析網(wǎng)絡(luò)編程(3)-- 基于TCP/UDP網(wǎng)絡(luò)編程應(yīng)注意的幾個(gè)地方

            Feedback

            # re: 網(wǎng)絡(luò)編程--實(shí)例分析(1)-- 基于TCP的的網(wǎng)絡(luò)應(yīng)用程序  回復(fù)  更多評(píng)論   

            2009-10-19 14:49 by 戴爾電腦
            使用recv函數(shù)從客戶(hù)端接收數(shù)據(jù)

            # re: 網(wǎng)絡(luò)編程--實(shí)例分析(1)-- 基于TCP的的網(wǎng)絡(luò)應(yīng)用程序  回復(fù)  更多評(píng)論   

            2009-10-19 15:07 by lantionzy
            流式套接字提供沒(méi)有記錄邊界的數(shù)據(jù)流:可以是雙向的字節(jié)流(應(yīng)用程序是全雙工:可以通過(guò)套接字同時(shí)傳輸和接收)。可依賴(lài)流傳遞有序的、不重復(fù)的數(shù)據(jù)。(“有序”指數(shù)據(jù)包按發(fā)送順序送達(dá)。“不重復(fù)”指一個(gè)特定的數(shù)據(jù)包只能獲取一次。)這能確保收到流消息,而流非常適合處理大量數(shù)據(jù)。
            數(shù)據(jù)文報(bào)套接字支持雙向數(shù)據(jù)流,此數(shù)據(jù)留不能保證按順序和不重復(fù)送達(dá)。數(shù)據(jù)文報(bào)也不保證是可靠的;它們可能無(wú)法到達(dá)目的地。數(shù)據(jù)文報(bào)可能不按順序到達(dá)并且可能會(huì)重復(fù),但只要記錄的大小沒(méi)有超過(guò)接收端的內(nèi)部大小限制,就會(huì)保持?jǐn)?shù)據(jù)中的記錄邊界。您負(fù)責(zé)管理順序和可靠性。(可靠性在局域網(wǎng) [LAN] 上往往很好,但在廣域網(wǎng) [WAN] 如 Internet 上卻不太好。)數(shù)據(jù)文報(bào)為“無(wú)連接”的,也就是不建立顯式連接。可將數(shù)據(jù)文報(bào)消息發(fā)送到指定的套接字,然后從指定的套接字接收消息。

            成人亚洲欧美久久久久| 久久久久亚洲AV综合波多野结衣| 久久九九免费高清视频| 国产精品18久久久久久vr| 中文字幕乱码人妻无码久久| 久久精品国产精品亚洲人人| 欧美一区二区精品久久| 97久久久久人妻精品专区| 色综合久久无码五十路人妻| 狠狠精品久久久无码中文字幕| 久久影视综合亚洲| 亚洲欧洲中文日韩久久AV乱码| 久久综合视频网站| 亚洲精品国产自在久久| 久久大香萑太香蕉av| 亚洲中文字幕无码一久久区| 久久人做人爽一区二区三区| 狠狠综合久久综合88亚洲| 亚洲国产另类久久久精品黑人| 国产成年无码久久久免费| 久久久久久久久久久久中文字幕| 97精品伊人久久大香线蕉app| 九九久久99综合一区二区| 国产精品欧美久久久久天天影视| 精品国产综合区久久久久久| 久久久久国产精品嫩草影院| 国产69精品久久久久APP下载| 色欲综合久久躁天天躁蜜桃| 91精品国产9l久久久久| 青草影院天堂男人久久| 久久久艹| 欧美亚洲色综久久精品国产| 精品久久久久久国产| 久久综合亚洲色HEZYO国产| 97香蕉久久夜色精品国产| 久久99精品久久久久子伦| 国内精品久久久久久久影视麻豆| 久久久久久久综合狠狠综合| 国产精品久久精品| 狠狠色伊人久久精品综合网| 久久亚洲国产精品成人AV秋霞|