<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《windows網絡編程技術》之 Winsock基礎

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

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

       

      posted @ 2006-02-14 11:15  紅心李  閱讀(521)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 极品人妻少妇一区二区三区| 欧美成本人视频免费播放| 葵青区| 丰满少妇熟乱xxxxx视频| 不卡在线一区二区三区视频| 俺来也俺去啦最新在线| 久久久久香蕉国产线看观看伊| 国产精品夫妇激情啪发布| 中国熟女仑乱hd| 波多野结衣在线播放| 亚亚洲视频一区二区三区| 国产精品久久露脸蜜臀| 最新亚洲av日韩av二区| 亚洲国产精品午夜福利| 亚洲av色香蕉一二三区| 卡一卡二卡三精品| 国产一级av在线播放| 精品国产成人国产在线视| 国产乱人伦偷精品视频下| 漂亮人妻被黑人久久精品| 精品国产一区二区亚洲人| 在线国产精品中文字幕| 天天躁日日躁狠狠躁av麻豆男男| 18禁精品一区二区三区| 午夜射精日本三级| 性欧美老妇另类xxxx| 亚洲乱码中文字幕综合| 一区二区三区不卡国产| 中文字幕乱码在线播放| 国产国产人免费人成免费| 高清自拍亚洲精品二区| 本溪| 青草99在线免费观看| 国产av中文字幕精品| 贡山| 午夜成人精品福利网站在线观看 | 中文字幕久久波多野结衣av| 亚洲精品揄拍自拍首页一| 尹人香蕉久久99天天拍| 婷婷色综合视频在线观看| 最新国产AV最新国产在钱|