1. 程式人生 > >C++ Socket程式設計(一) 概述

C++ Socket程式設計(一) 概述

學習Socket程式設計時,整理的知識點。

套接字的概念及分類

在網路中,要全域性的標識一個參與通訊的程序,需要三元組:協議,IP地址以及埠號。要描述兩個應用程序之間的端到端的通訊關聯需要五元組:協議,信源主機IP,信源應用程序埠,信宿主機IP,信宿應用程序埠。為了實現兩個應用程序的通訊連線,提出了套接字的概念。套接字可以理解為通訊連線的一端,將兩個套接字連線在一起,可以實現不同程序之間的通訊。
針對不同的通訊需求,TCP/IP中提供了三種不同的套接字:
(1)流套接字(SOCK_STREAM)
流套接字用於面向連線,可靠的資料傳輸服務。它之所以能實現可靠的資料服務,是因為它使用了傳輸控制協議–TCP。適合傳輸大量的資料,但是不支援廣播和組播。
(2)資料報套接字(SOCK_DGRAM)
資料報套接字提供了一種無連線的服務,通訊雙方不需要建立任何顯示連線,資料可以傳送到指定的套接字。資料報套接字使用UDP進行資料傳輸,支援廣播和組播方式。
(3)原始套接字(SOCK_RAW)
原始套接字與標準套接字(上面兩個)區別在於:原始套接字可以讀寫核心沒有處理的IP資料報,流套接字只能讀寫TCP資料報,資料報套接字只能讀寫UDP資料報。原始套接字的主要目的是避開TCP/IP的處理機制,被傳送的資料報可以直接傳送給需要他的程式。主要用於編寫自定義地層協議的應用程式。

WinSock函式

1.WSAStartup函式:
功能:用於初始化WinSock,即檢查系統中是否有Windows Sockets的實現庫。
格式:int WSAStartup(WORD wVersionRequest, LPWSADATA lpWSAData)。
引數:wVersionRequest使用WinSock的最低版本號,lpWSAData是WSADATA指標。
返回值:函式成功呼叫返回0,失敗時返回非0。
說明:此函式是應用程式呼叫的第一個WinSock函式,只有在該函式呼叫成功後才能呼叫其他WinSock函式。

2.socket函式:
功能:為應用程式建立套接字。
格式:SOCKET socket(int af, int type, int protocol)。
引數:af-套接字使用的協議地址族,如果使用TCP或者UDP,只能使用AF_INET;type-套接字協議型別,如SOCK_STREAM、SOCK_DGRAM;protocol-套接字使用的特定協議,如果不希望特別指定協議型別,則設定為0。
返回值:函式成功呼叫後返回一個新的套接字,是一個無符號的整型資料;失敗時返回INVALID_SOCKET。
說明:應用程式在使用套接字通訊之前,必須擁有一個套接字。

3.bind函式:
功能:實現套接字與主機本地IP地址和埠號的繫結。
格式:int bind(SOCKET s, const struct sockaddr *name, int namelen)。
引數:s-將要繫結的套接字;name-與指定協議有關的地址結構指標;namelen-name引數的長度。
返回值:函式成功時返回0;失敗時返回SOCKET_ERROR。

4.listen函式:
功能:設定套接字為監聽狀態,準備接收由客戶機程序發出的連線請求。
格式:int listen(SOCKET s, int backlog)。
引數:s-已繫結地址,但還未建立連線的套接字識別符號;backlog-指定正在等待連線的最大佇列長度。
返回值:函式成功時返回0;失敗時返回SOCKET_ERROR。
說明:僅適用於面向連線的套接字,且用於伺服器程序。

5.connect函式:
功能:提出與伺服器建立連線的請求,如果伺服器程序接受請求,則伺服器程序與客戶機進城之間便建立了一條通訊連線。
格式:int connect(SOCKET s, const struct sockaddr FAR *name, int namelen )。
引數:s-欲要建立連線的套接字;name-指向通訊對方的套接字地址結構指標,表示s欲與其建立連線;namelen-name引數的長度。
返回值:函式成功時返回0;失敗時返回SOCKET_ERROR。
說明:在客戶機程序呼叫該方法請求建立連線時,將啟用建立連線的3次握手,以此來建立一條與伺服器程序的TCP連線。如果該函式呼叫之前沒有繫結地址,系統自動繫結本地地址到此套接字。

6.accept函式:
功能:接受客戶機程序呼叫connect函式發出的連線請求。
格式:SOCKET accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen)。
引數:s-處於偵聽狀態的套接字;addr-指向一個用來存放發出連線請求的客戶機程序IP地址資訊的地址結構指標;addrlen-addr的長度。
返回值:呼叫成功返回一個新的套接字,這個套接字對應於已接受的那個客戶機程序的連線,失敗時返回INVALID_SOCKET。
說明:用於面向連線的伺服器程序,在IP協議族中只適用於TCP伺服器端。

7.shutdown函式:
功能:關閉套接字讀寫通道,即停止套接字接受傳遞的功能。
格式:int shutdown(SOCKET s, int how)。
引數:s-套接字;how-描述停止哪些操作。
how-0:不再接收訊息;
how-1:不再允許傳送訊息;
how-2:既不接收訊息,也不再發送訊息。
返回值:函式成功時返回0;失敗時返回SOCKET_ERROR。
說明:只是停止套接字的功能,並沒有關閉套接字,套接字的資源還沒釋放。

8.closesocket函式:
功能:關閉套接字,釋放與套接字關聯的所有資源。
格式:int closesocket(SOCKET s)。
引數:s-將要關閉的套接字。
返回值:函式成功時返回0;失敗時返回SOCKET_ERROR。
說明:當套接字s的資料緩衝佇列中還有未發出的資料時,如果套接字設定為SO_DONTLINGER,則等待資料緩衝佇列中的資料繼續傳輸完畢關閉該套接字;如果套接字設定為SO_LINGER,則分以下兩種情況:
(1)Timeout設為0,套接字馬上關閉,資料緩衝佇列中資料丟失。
(2)Timeout不為0,等待資料傳輸完畢或者Timeout為0時關閉套接字。

9.WSACleanup函式:
功能:終止使用WinSock,釋放為應用程式分配的相關資源。
格式:int WSACleanup()。
引數:無。
返回值:呼叫成功時返回0,失敗時返回非0。
說明:該函式是任何一個基於WinSock應用程式在最後必須呼叫的函式,終止了所有Windows Sockets在所有執行緒上的操作。

10.recv函式:
功能:在已建立連線的套接字上接收資料。
格式:int recv(SOCKET s, char *buf, int len, int flags)。
引數:s-已建立連線的套接字;buf-存放接收到的資料的緩衝區指標;len-buf的長度;flags-呼叫方式:
(1)0:接收的是正常資料,無特殊行為。
(2)MSG_PEEK:系統緩衝區資料複製到提供的接收緩衝區,但是系統緩衝區內容並沒有刪除。
(3)MSG_OOB:表示處理帶外資料。
返回值:接收成功時返回接收到的資料長度,連線結束時返回0,連線失敗時返回SOCKET_ERROR。

11.send函式:
功能:在已建立連線的套接字上傳送資料.
格式:int send(SOCKET s, const char *buf, int len, int flags)。
引數:引數:s-已建立連線的套接字;buf-存放將要傳送的資料的緩衝區指標;len-傳送緩衝區中的字元數;flags-控制資料傳輸方式:
(1)0:接收的是正常資料,無特殊行為。
(2)MSG_DONTROUTE:表示目標主機就在本地網路中,無需路由選擇。
(3)MSG_OOB:表示處理帶外資料。
返回值:傳送成功時返回傳送的資料長度,連線結束時返回0,連線失敗時返回SOCKET_ERROR。

套接字程式設計流程

下面以流套接字為例,介紹客戶機/伺服器工作模型
這裡寫圖片描述

相關推薦

C++ Socket程式設計 概述

學習Socket程式設計時,整理的知識點。 套接字的概念及分類 在網路中,要全域性的標識一個參與通訊的程序,需要三元組:協議,IP地址以及埠號。要描述兩個應用程序之間的端到端的通訊關聯需要五元組:協議,信源主機IP,信源應用程序埠,信宿主機IP,信宿應用

socket程式設計最簡單的c/s模式

      最簡單的C/S模式是經典的入門模式,也是大多數教材講解最多的,總的來說分為下面的幾個步驟 左邊為 客戶端模式,右邊為伺服器模式 伺服器模式相對複雜一點,這一點是肯定的,因為伺服器面對很多不同的客戶端的連線。 相關函式不解釋,入門級別的書本上都有,而且講解的非常

進擊的小白Day002——基於TCP的Socket程式設計

這個程式算是這輩子寫的第一個完整的程式,不是今天一天寫的,之前花了四五天,不到四百行的程式碼對程式設計老鳥來說估計是分分鐘的事,但我還是挺知足的,畢竟第一次。 真正自己嘗試寫一個程式之後才發現,之前看的所有的東西都是紙上談兵,只有自己動手寫一個程式,才會理解什麼叫程式設計,從程式設計到程

Halcon和C#混合程式設計:數字識別

Halcon匯出C#程式碼 using System; using HalconDotNet; public partial class HDevelopExport { public HTuple hv_ExpDefaultWinHandle; //

Socket程式設計

1.套接字地址 一個客戶端要發起一次通訊,首先要知道執行伺服器端程式的主機IP地址。然後由網路基礎設施利用目標地址將客戶端傳送的資訊傳遞到正確主機上。在Java中,地址可以由一個字串定義,可以是數字型的地址(192.168.1.10(IPv4地址),fe20:12a0::0

第二章—C++簡單程式設計

計算機的最基本的功能是資料處理 C++支援的基本資料型別:整數、實數、字元、布林資料 C++支援的基本運算:算術運算、關係運算、邏輯運算、位運算、逗號運算、條件運算 程式要能夠輸入資料、輸出資料 C++中的輸入/輸出可以呼叫預定義的功能模組實現 程式的執行流程 順序的,因此程

java網路程式設計:11、基於UDP的socket程式設計理論、基本步驟

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、基於UDP的socket程式設計 二、基本步驟 三、系列文章(java網路程式設計) 一、基於UDP的socket程式設計 對於基於UDP通訊來說,通訊雙方不需要建

java網路程式設計:8、基於TCP的socket程式設計簡單的socket通訊_一個客戶端

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、基於tcp的程式設計,就好像用電話進行交談一樣 二、在java中用於程式設計網路程式的類 三、套接字 + (輸出、輸入流) 1、伺服器程式編寫基本步驟: 2、客戶端程式

C語言程式設計-基礎知識2

15. 程式設計是指從確定任務到得到結果、寫出文件的全過程16. 程式設計工作過程a) 問題分析b) 設計演算法c) 編寫程式d) 對源程式進行編輯、編譯和連線e) 執行程式,分析結果f) 編寫程式文件17. 程式包括兩方面的資訊a) 對資料的描述。在程式中要指定用到哪些資料

socket程式設計,實現伺服器與客戶端簡單通訊

本節主講客戶端向服務傳送資訊,伺服器轉發給客戶端,當然也可以稍微改一下程式碼可以實現互傳訊息,不再贅述。 難點在於伺服器端的程式碼思路: (1)主程式Socket socket=server.acc

C++ Socket程式設計 send與recv 緩衝區與阻塞

socket緩衝區 每一個socket在被建立之後,系統都會給它分配兩個緩衝區,即輸入緩衝區和輸出緩衝區。 send函式並不是直接將資料傳輸到網路中,而是負責將資料寫入輸出緩衝區,資料從輸出緩衝區傳送到目標主機是由TCP協議完成的。資料寫入到輸出緩衝區之

C++網路程式設計gRPC的編譯

Google是真滴煩,整個編譯鏈全是自家產品,在編譯之前先來安裝一堆東西 安裝環境依賴 chocolatey Windows下的

C#.網路程式設計 Socket基礎Socket TCP協議 實現端到端伺服器與客戶端簡單字串通訊

簡介:        本章節主要討論了Socket的入門知識,還未針對Socket的難點問題(比如TCP的無訊息邊界問題)展開討論,往後在其他章節中進行研究。 注意點: 伺服器(比如臺式電腦)的IP為1.1.1.2,那麼客戶端(其他裝置,比如手機,Ipad)連線的一定是

GUN C中的socket學習

ipp 區分 如果 raw 文件表 一起 通訊 res 概念   socket是用於通信的工具。   套接字其實是一個廣義上的進程間通信的信道。就像pipe一樣,在GUN環境下socket也被用一個文件表示。不同的socket文件可以用於不同的進程間通信,甚至可以用來在網絡

Python Socket網路程式設計初識SocketSocket初步使用

目錄 前言 網路程式設計 實質 IP地址和埠 資料傳輸協議 協議 Socket

Socket網路程式設計

此文使用的協議是 TCP       首先要寫入以下程式碼,不然很多函式都用不了 #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib")   ●伺服器端    

C學習筆記程式設計作業

C學習筆記(一)-程式設計作業 第十一週作業: [Loop]雙基迴文數 [Loop]校門外的樹 [Algorithm]約瑟夫環 [Recursion] 漢諾塔 [Algorithm]紀念郵票 [algorithm]

基於Linux的C程式設計

一、GCC概述 1、GCC概述 一個c/c++程式從開始編碼到生成二進位制可執行檔案至少要經過四個步驟。   (1)預處理:對原始檔的巨集進行展開。   (2)編譯:將源程式編譯成彙編檔案。   (3)彙編:將彙編檔案編譯成機器碼。   (4)連結:將目標檔案和外部符號進行連結,生成可執行檔案。

Python C/S 網路程式設計之 三種方法實現天氣預報小程式

1. 首先明白下協議棧和庫的概念: 協議棧(Protocol Stack): 是指網路中各層協議的總和,其形象的反映了一個網路中檔案傳輸的過程:由上層協議到底層協議,再由底層協議到上層協議。 庫(Library):主要用來解析要使用的網路通訊協議,包含Python內建標準庫

第2章 C++的簡單程式設計

第2章 C++的簡單程式設計(一) C++語言概述 名稱空間 基本資料型別、常量、變數 程式舉例 讀入並顯示資料 運算與表示式 sizeof, 位運算