• <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++博客 :: 首頁 :: 新隨筆 :: 聯(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)建,通過綁定操作與驅(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)模式,即客戶向服務(wù)器提出請(qǐng)求,服務(wù)器接收到請(qǐng)求后,提供相應(yīng)的服務(wù)。
               下面通過一個(gè)簡(jiǎn)單的實(shí)例來講述基于TCP的socket編程的通信流程。其中服務(wù)器端程序?qū)崿F(xiàn)代碼TCPSrv.cpp如下:
            Server
               在這段代碼中,首先定義了一個(gè)WORD類型的變量:wVersionRequested,用來保存WinSocl庫(kù)的版本號(hào),接著調(diào)用MAKEWORD宏創(chuàng)建一個(gè)包含了請(qǐng)求版本號(hào)的WORD值,之后調(diào)用WSAStartup函數(shù)加載套接字庫(kù),如果其返回值不等于0 ,則程序退出。接下來判斷wsaData.wVersion的低字節(jié)和高字節(jié)是否都等于1,如果不是我們請(qǐng)求的版本,那么調(diào)用WSACleanup函數(shù)終止對(duì)Winsock庫(kù)的使用并返回。
               加載套接字庫(kù)后,就可以按照一定流程來編寫實(shí)現(xiàn)代碼了:
               1、創(chuàng)建套接字(socket)
               利用socket函數(shù)創(chuàng)建套接字,對(duì)于它來說,第一個(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ù)地址格式和套接字類別,自動(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è)指針,可以用取地址符來實(shí)現(xiàn),并且addrSrv變量是SOCKADDR_IN結(jié)構(gòu)體類型,而這里需要的是SOCKADDR*類型,所以要進(jìn)行強(qiáng)制轉(zhuǎn)換。第三個(gè)參數(shù)是指定地址結(jié)構(gòu)的大小,可以利用sizeof操作符來獲取。
               3、將套接字設(shè)為監(jiān)聽模式(listen),準(zhǔn)備接收客戶請(qǐng)求。其中l(wèi)isten函數(shù)第二個(gè)參數(shù)是指等待連接隊(duì)列的最大長(zhǎng)度。
               4、等待客戶請(qǐng)求的到來;當(dāng)請(qǐng)求到來后,接受連接請(qǐng)求,返回一個(gè)新的對(duì)應(yīng)于此連接的套接字(accept)。
               接下來,需要調(diào)用accept函數(shù)等待并接受客戶的連接請(qǐng)求。因?yàn)樽鳛榉?wù)器端,它需要不斷的等待客戶端的連接請(qǐng)求的到來,所以設(shè)計(jì)成一個(gè)死循環(huán)。當(dāng)客戶端有請(qǐng)求時(shí),該函數(shù)接受請(qǐng)求建立連接,同時(shí)返回一個(gè)相對(duì)于當(dāng)前這個(gè)新連接的一個(gè)套接字描述符,保存于sockConn變量中,然后利用這個(gè)套接字就可以與客戶端進(jìn)行通信了,而我們先前的套接字仍繼續(xù)監(jiān)聽客戶端的連接請(qǐng)求。
               5、用返回的套接字和客戶端進(jìn)行通信(send/recv)
               可以調(diào)用send函數(shù)向客戶端發(fā)送數(shù)據(jù),注意這里使用的套接字是已建立連接的那個(gè)套接字:sockConn,而不是用于監(jiān)聽的那個(gè)套接字:addrSrv。使用recv函數(shù)從客戶端接收數(shù)據(jù)。
               6、返回等待另一個(gè)客戶請(qǐng)求
               7、關(guān)閉套接字

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

               首先運(yùn)行服務(wù)器端程序,然后再運(yùn)行客戶端程序,可以看到客戶端收到了服務(wù)器端返回的信息:Welcome 127.0.0.1 to http://www.shnenglu.com/lantionzy,而服務(wù)器端收到了客戶端發(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ù)從客戶端接收數(shù)據(jù)

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

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

            久久亚洲天堂| 99久久精品免费看国产一区二区三区 | 久久亚洲AV成人出白浆无码国产| 99久久国产综合精品五月天喷水 | 久久久老熟女一区二区三区| 日韩va亚洲va欧美va久久| 2021少妇久久久久久久久久| 中文字幕久久精品无码| 色综合久久中文字幕综合网| 国产精品女同一区二区久久| 久久国产一区二区| 国产亚洲欧美成人久久片| 国产精品久久午夜夜伦鲁鲁| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久SE精品一区二区| 国产A三级久久精品| 亚洲精品美女久久久久99| 久久精品国产亚洲AV不卡| 少妇人妻综合久久中文字幕| 国产成人综合久久精品红| 日韩欧美亚洲综合久久| 噜噜噜色噜噜噜久久| 亚洲欧美日韩久久精品| 久久无码国产专区精品| 久久久久亚洲AV片无码下载蜜桃| 久久久久久精品免费看SSS| 亚洲国产另类久久久精品小说| 久久久噜噜噜久久熟女AA片 | 午夜不卡888久久| 国产激情久久久久影院老熟女| 国产亚洲色婷婷久久99精品91 | 一本色综合久久| 久久无码中文字幕东京热| 精品免费久久久久久久| 国产精品99久久久久久猫咪| 91精品久久久久久无码| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 婷婷伊人久久大香线蕉AV| 国产精品青草久久久久婷婷 | 三级韩国一区久久二区综合 | 99久久精品国产高清一区二区|