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

            興海北路

            ---男兒仗劍自橫行
            <2008年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計

            • 隨筆 - 85
            • 文章 - 0
            • 評論 - 17
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類

            隨筆檔案

            收藏夾

            全是知識啊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            《windows網(wǎng)絡編程技術》之 Winsock基礎 - [技術補鈣]
            轉自http://xiekeli.blogbus.com/logs/4019775.html

            前段時間根據(jù)客服的反映,老翁的前置機程序存在不工作的情況,初步表現(xiàn)為GPRS登錄失敗,我查看了報文(強烈要求老板發(fā)獎金,有什么問題我總 是沖鋒在前)發(fā)現(xiàn)基本出現(xiàn)在網(wǎng)絡頻繁斷開的情況后(網(wǎng)絡每隔10分鐘被斷開一次,socket錯誤10053,什么原因還不得而知)。忘了說了,前置機是 通過TCP連接到省局的GPRS代理服務器(是由小賴開發(fā)的)然后和現(xiàn)場的終端進行通信。前置機程序中是通過delphi的clientsocket進行 連接的。一下子還真不知道是什么原因。對于socket這塊我絕對不是專家,知其然,不知其所以然。于是我決定先從清理基本概念開始:
            鳥瞰TCP/IP體系結構 
            首先從TCP/IP體系結構開始(這也是不少公司面試時的必備良題啊),相信下圖已經(jīng)表達得非常清除了
            其次是winsocket與tcp/ip(其實,不止TCP/IP協(xié)議族,這里只討論TCP/IP) 
            TCP/IP協(xié)議核心與應用程序關系圖。

            最后是常用協(xié)議特性:
             關于定址
            Winsock中,通過SOCKADDR_IN結構來描述IP地址和服務端口:
            struct sockaddr_in
            {
                  short                             sin_family;
                  u_short                         sin_port;
                  struct in_addr               sin_addr;
                  char                              sin_zero[8];
            };
            哦,我只關心IP協(xié)議,所以sin_family = AF_INET;
            關于端口要注意哦,0-1023為固定服務保留的(別打他們的注意了);1024-49151供普通用戶的普通用戶進程使用;49152-65535是動態(tài)和私有端口。
            幾個特殊地址:
              INADDR_ANY:允許服務器應用監(jiān)聽主機上每個網(wǎng)絡接口上的客戶機活動;
              INADDR_BROADCAST用于在一個IP網(wǎng)絡中發(fā)送廣播UDP數(shù)據(jù)報。
            字節(jié)排序:
            從主機字節(jié)順序---> 網(wǎng)絡字節(jié)順序
            返回四字節(jié),用于IP地址
            u_long htonl(u_long hostlong)
            int WSAHtonl(
                    SOCKET s,
                    u_long hostlong,
                    u_long FAR * lpnetlong
            );
            返回兩字節(jié),用于端口號
            u_short htons(u_short hostshort);
            int WSAHtons(
                  SOCKET s,
                  u_short hostshort,
                  u_short FAR * lpnetshort
            ); 
            對應的反向函數(shù):
            u_long ntohl(u_long netong)
            int WSANtohl(
                    SOCKETs,
                    u_long netong,
                    u_long FAR * lphostlong
            );
            u_short htons(u_short netshort);
            int WSANtons(
                  SOCKET s,
                  u_short netshort,
                  u_short FAR * lphostshort
            ); 
            進入winsocket
             下面開始整理winsocket 的一些細節(jié):
             所有的winsocket應用其實都是調(diào)用winsock dll 中的方法,所以通過WSAstartup加載是第一步。否則就會出錯:WSANOTINITIALISED(10093)。
            下面先來看看面向連接的協(xié)議:
            從服務器端來看:
            1.bind,將套接字和一個已知的地址進行綁定。
             
            這樣就創(chuàng)建了一個流套接字,這個步驟最常見的錯誤是WSAEADDRINUSE (10048) ,表示另外一個進程已經(jīng)和本地IP和端口進行了綁定,或者那個IP地址和端口號處于TIME_WAIT狀態(tài)。
            2.Listen,將套接字置于監(jiān)聽狀態(tài)。
              
              int listen(
                    SOCKET s,
                   int backlog
                )
            backlog參數(shù)指定了正在等待連接的最大隊列長度,如果實際訪問的客戶端大于該最大長度就會出錯:WSAECONNREFUSED (10061)。事實上該backlog本身也是由基層協(xié)議提供者決定的。在這個階段還有一種常見的錯誤就是WSAEINVAL (10022),即沒有綁定就進行監(jiān)聽了。
            3.accept和WSAAccept
            SOCKET accept(
            SOCKET s,
            struct sockaddr FAR *addr,
            int FAR* addrlen,
            調(diào)用accept可為待決連接隊列中的第一個連接請求提供服務。(在服務器端接收連接前,所有的客戶端連接請求是放在一個“待決”隊列中的。)
            accept會返回一個新的套接字描述符,它對應于已經(jīng)接受的那個客戶機連接。對于
            該客戶機后續(xù)的所有操作,都應使用這個新套接字。至于原來那個監(jiān)聽套接字,它仍然用于
            接受其他客戶機連接,而且仍處于監(jiān)聽模式。
            SOCKET WSAAccept(
            SOCKET s,
            struct sockaddr FAR *addr,
            LPINT addrlen,
            LPCONDITIONPROC lpfncondition,
            DWORD dwCallBackData
            對于客戶端相對要簡單得多,主要由以下幾步:
            1) 用socket或WSASocket創(chuàng)建一個套接字。
            2) 解析服務器名(以基層協(xié)議為準)。
            3) 用connect或WSAConnect初始化一個連接。
            在connect過程常發(fā)生的錯誤有:WSAECONNREFUSED (10061)連接的計算機沒有監(jiān)聽指定端口的進程;WSAETIMEDOUT (10060)這種情況一般發(fā)生在試圖連接的計算機不能用時(亦可能因為到主機之間的路由上出現(xiàn)硬件故障或主機目前不在網(wǎng)上)。
            連接之后就是數(shù)據(jù)傳輸了,就是發(fā)送和接收了:
            int send(
                SOCKET s,
                const char FAR * buf,
                int len,
                int flags)
            返回發(fā)送的字節(jié)數(shù),如果出錯常見的錯誤是:WSAECONNABORTED (10053) 這一錯誤一般發(fā)生在虛擬回路由于超時或協(xié)議有錯而中斷的時候。遠程主機上的應用通過執(zhí)行強行關閉或意外中斷操作重新設置虛擬虛路時,或遠程主機重新啟動時,發(fā)生的則是WSAECONNRESET(10054)錯誤。。最后一個常見錯誤是WSAETIMEOUT(10060),它發(fā)生在連接由于網(wǎng)絡故障或遠程連接系統(tǒng)異常死機而引起的連接中斷時。
            int recv(
                SOCKET s,
                const char FAR * buf,
                int len,
                int flags)
            無連接協(xié)議
                首先從接收端(類似于有連接方式中的服務端,但不是服務端)看,首先也是通過socket或WSAsocket創(chuàng)建套接字。再通過bind進行綁定。下面跳過Listen和Accept步驟,直接等待接收就可以了。
            接收函數(shù):
            int recvfrom(
                SOCKET s,
                char FAR * buf,
                int len,
                int flags,
                struct SockAddr FAR *from,
                int FAR * fromlen
            )
            發(fā)送:建立SCOKET后調(diào)用sendto或WSASendTo
            int sendto(
                SOCKET s,
                char FAR * buf,
                int len,
                int flags,
                struct SockAddr FAR * to,
                int FAR * tolen
            )

            posted on 2008-03-18 11:16 隨意門 閱讀(601) 評論(0)  編輯 收藏 引用

            久久亚洲AV无码西西人体| 久久免费的精品国产V∧| 新狼窝色AV性久久久久久| 7777久久久国产精品消防器材| 奇米影视7777久久精品人人爽| 亚洲人成网亚洲欧洲无码久久| 亚洲精品国产美女久久久| 久久99精品久久久久久久久久| 精品国产热久久久福利| 伊人久久久AV老熟妇色| 久久精品国产精品青草app| 香蕉久久夜色精品国产尤物| 久久777国产线看观看精品| 久久精品国产WWW456C0M| 国产精品免费看久久久| 国产精品九九久久免费视频| 久久精品亚洲精品国产色婷| 午夜精品久久久久久久无码| 91精品免费久久久久久久久| 国产欧美久久久精品| 色婷婷噜噜久久国产精品12p| 久久久久99精品成人片欧美 | 丁香五月网久久综合| 中文字幕久久精品无码| 久久久久这里只有精品| 精品久久久噜噜噜久久久| 无码任你躁久久久久久老妇App| 久久99精品国产99久久6男男| 久久精品国产亚洲αv忘忧草| 国内精品伊人久久久久777| 欧美一级久久久久久久大片 | 怡红院日本一道日本久久| 精品久久久无码人妻中文字幕| 精品久久久久一区二区三区| 色综合久久综精品| 国产综合精品久久亚洲| 久久综合久久综合九色| 亚洲国产精久久久久久久| 青青草原综合久久大伊人精品| 久久久久久久人妻无码中文字幕爆| 无码AV波多野结衣久久|