初始Winsock編程

来源:http://www.cnblogs.com/suvllian/archive/2016/05/06/5464877.html
-Advertisement-
Play Games

1、套接字的創建和關閉 使用套接字之前,必須使用socket函數創建一個套接字,此函數調用成功將返回一個套接字句柄。 type參數指定套接字的類型。套接字有流套接字、數據報套接字和原始套接字。 SOCK_STREAM 流套接字,使用TCP提供有連接的可靠的傳輸。 SOCK_DGRAM 數據報套接字, ...


1、套接字的創建和關閉

  使用套接字之前,必須使用socket函數創建一個套接字,此函數調用成功將返回一個套接字句柄。

1 SOCKET socket(
2  int  af,   //用來指定套接字使用的地址格式,Winsock中只能使用AF_INET
3  int  type,   //用來指定套接字的類型
4  int  protocol    //配合type參數使用,用來指定使用的協議類型。可以是IPPROTO_TCP等   
5 );

  type參數指定套接字的類型。套接字有流套接字、數據報套接字和原始套接字

  SOCK_STREAM  流套接字,使用TCP提供有連接的可靠的傳輸。

  SOCK_DGRAM   數據報套接字,使用UDP提供無連接的不可靠的傳輸。

  SOCK_RAW          原始套接字,由程式自行處理數據報以及協議首部。

  當type參數明確為SOCK_STREAM和SOCK_DGRAM時,protocol參數的值可為0。

  函數調用失敗時返回INVALID_SOCKET(-1),可通過WSAGetLastError取得錯誤代碼。

  當不使用創建的套接字時,應調用closesocket函數來關閉套接字。沒有發生錯誤則返回0,否則返回SOCKET_ERROR。

1 int closesocket(SOCKET s);   //函數唯一的參數就是要關閉的套接字

2、綁定套接字到指定的IP地址和埠號:bind函數

1 int  bind(
2   SOCKET s,    //套接字句柄
3   const struct sockaddr* name,    //要關聯的本機地址
4   int  namelen     //地址的長度
5 )

  綁定函數安排一個本地名稱到未命名的socket而建立此socket的本地關聯。本地名稱包括三部分:主機地址、協議號(TCP和UDP)和埠號。

1 sockaddr_in sin;
2 sin.sin_family = AF_INET;           //地址協議家族
3 sin.sin_port    = htons(4567);     //4 sin.sin_addr.S_un.S_addr = INADDR_ANY;   //監聽的IP地址
5 if(::bind(sListen,(LPSOCKET)&sin,sizeof(sin)) == SOCKET_ERROR)
6 {
7      printf("Failed bind()\n");
8      return 0;
9 }

3、設置套接字進入監聽狀態:listen函數

1 int listen(
2 SOCKET s,      //套接字句柄
3 int backlog     //監聽隊列中允許保持的尚未處理的最大連接數量
4 );

   listen僅應用在支持連接的套接字上。函數執行成功後,套接字s進入被動模式,到來的連接會被通知要排隊等候接受處理。

  在同一時間處理多個連接請求的伺服器通常使用listen函數,如果一個連接請求到達,且排隊已滿,客戶端將收到WSAECONNREFUSED錯誤。

4、接受連接請求:accept函數

1 SOCKET accept(
2     SOCKET s,    //套接字句柄
3     struct  sockaddr*  addr,   //一個指向sockaddr_in結構的指針,用於取得對方的地址信息
4     int*  addrlen   //一個指向地址長度的指針
5 );

  該函數預設工作在阻塞模式下。函數在s上取出未處理連接中的第一個連接,為這個連接創建新的套接字,返回它的句柄。新創建的套接字是處理實際連接的套接字,與s有相同的屬性。

  addrlen參數用於指定addr所指空間的大小,也用於返回地址的實際長度。如果為NULL,則沒有關於遠程地址的信息返回。

  客戶端程式在創建套接字之後,需要使用connect函數請求與伺服器進行連接。

1 int    connect(
2     SOCKET s,    //套接字句柄
3     const struc sockaddr FAR* name,   //一個指向sockaddr_in結構的指針,包含了要連接的伺服器的信息
4     int namelen     //sockaddr_in結構的指針
5 );

  第一個參數所說的套接字句柄指的是客戶端的套接字,而另外兩個參數都是用來定址遠程套接字,即伺服器端的監聽套接字。

5、收發數據

  對於流套接字,一般使用send和recv函數來收發數據。

1 int    send(
2 SOCKET  s,    //套接字句柄
3 const  char FAR* buf,   //要發送數據的緩衝區地址
4 int  len,      //緩衝區長度
5 int  flags    //指定了調用方式,一般設為0
6 );
1 int    recv(SOCKET s,char FAR* buf,int len,int flags);

   最後解釋一下什麼是套接字及其作用:

  套接字是支持TCP/IP網路通信的基本操作單元,可以看做不同主機之間的進程進行雙向通信的端點。簡單說就是通信雙方的一種約定,用套接字中的相關函數可以完成通信過程。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查看資料庫版本: 1)select * from PRODUCT_COMPONENT_VERSION; 2)select * from v$version; 根據子節點查詢所有的父節點: 根據父節點查詢所有子節點: 純Oracle實現的日曆 如何分辨用戶是從哪台機器登錄的用戶 ...
  • 1.想利用sql2008的數據挖掘功能,以為是沒有安裝全,所以就卸載了。 (1)利用Windows Installer Clean UP將以前的卸載乾凈 (2)出現了Could not open key...... 問題,網上的: 以管理員身份運行CMD命令提示符,輸入以下語句並運行secedit  ...
  • LVM管理與Linux系統安裝 1.前言2. jnlp的文件打開3.java應用程式安全設置 一、前言 本篇博文記錄了Linux下jnlp文件的打開方式和java應用程式被安全設置阻止的解決辦法。 二、jnlp的文件打開 Java環境是通過rpm包安裝: 直接雙擊;Java環境是通過bin文件安裝: ...
  • 北韓的 IT 應用狀況並不為外界所熟知,過去媒體紛紛報道,北韓已故領導人金正日酷愛蘋果電子產品,而最近一份調查報告顯示,在北韓個人電腦操作系統市場,蘋果 MAC OS X 系統位居第一名,遙遙領先微軟 Windows。 據美國科技新聞網站 Softpedia 於 5 月 5 日報道,科技市場研究公司 ...
  • 由於windows在安裝時,boot loader會預設裝在MBR及分割槽的boot sector中,而且並不提供開機選單;而linux在安裝時安裝程式可以選擇是安裝在MBR中還是boot sector中,同時可以手動選單,並把windows開機選項加入開機選單中,若最後安裝windows,則會覆蓋 ...
  • ...
  • # 刪除 untracked files git clean -f # 連 untracked 的目錄也一起刪掉 git clean -fd # 連 gitignore 的untrack 文件/目錄也一起刪掉 (慎用,一般這個是用來刪掉編譯出來的 .o之類的文件用的) git clean -xfd ...
  • 首先,先選擇好你要安裝的iso文件(一般下載好Apache後,把該文件包製作成iso鏡像文件),然後選擇確定,如下圖所示: 進入系統後,以root用戶模式,輸入以下命令: 掛載光碟機,輸入以下命令: 進入/mnt目錄下,輸入以下命令: 把你要安裝的文件複製到/home目錄下,命令如下: 切換到/hom ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...