1. 程式人生 > >C/C++ socket網路程式設計掃盲篇

C/C++ socket網路程式設計掃盲篇

引言

socket 是“套接字”的意思,是計算機之間進行通訊的一種約定,也可以認為是一種技術。通過 socket 這種約定,一臺計算機可以接收其他計算機的資料,也可以向其他計算機發送資料。


socket 的典型應用就是 Web 伺服器和瀏覽器:瀏覽器獲取使用者輸入的URL,向伺服器發起請求,伺服器分析接收到的URL,將對應的網頁內容返回給瀏覽器,瀏覽器再經過解析和渲染,就將文字、圖片、視訊等元素呈現給使用者。

學習 socket,就是學習計算機之間如何通訊,並能夠用程式語言開發出實用的程式。

IP地址(IP Address)

計算機分佈在世界各地,要想和它們通訊,必須要知道確切的位置。確定計算機位置的方式有多種,IP 地址是最常用的,例如,114.114.114.114 是國內第一個、全球第三個開放的 DNS 服務地址,127.0.0.1 是本機地址。


其實,我們的計算機並不知道 IP 地址對應的地理位置,當要通訊時,只是將 IP 地址封裝到要傳送的資料包中,交給路由器去處理。路由器有非常智慧和高效的演算法,很快就會找到目標計算機,並將資料包傳遞給它,完成一次單向通訊。

目前大部分軟體使用 IPv4 地址,但 IPv6 也正在被人們接受,尤其是在教育網中,已經大量使用。

埠(Port)

有了 IP 地址,雖然可以找到目標計算機,但仍然不能進行通訊。一臺計算機可以同時提供多種網路服務,例如Web服務、FTP服務(檔案傳輸服務)、SMTP服務(郵箱服務)等,僅有 IP 地址,計算機雖然可以正確接收到資料包,但是卻不知道要將資料包交給哪個網路程式來處理,所以通訊失敗。


為了區分不同的網路程式,計算機會為每個網路程式分配一個獨一無二的埠號(Port Number),例如,Web服務的埠號是 80,FTP 服務的埠號是 21,SMTP 服務的埠號是 25。

埠(Port)是一個虛擬的、邏輯上的概念。可以將埠理解為一道門,資料通過這道門流入流出,每道門有不同的編號,就是埠號。如下圖所示:


協議(Protocol)

協議(Protocol)就是網路通訊的約定,通訊的雙方必須都遵守才能正常收發資料。協議有很多種,例如 TCP、UDP、IP 等,通訊的雙方必須使用同一協議才能通訊。協議是一種規範,由計算機組織制定,規定了很多細節,例如,如何建立連線,如何相互識別等。

協議僅僅是一種規範,必須由計算機軟體來實現。例如 IP 協議規定了如何找到目標計算機,那麼各個開發商在開發自己的軟體時就必須遵守該協議,不能另起爐灶。

所謂協議族(Protocol Family),就是一組協議(多個協議)的統稱。最常用的是 TCP/IP 協議族,它包含了 TCP、IP、UDP、Telnet、FTP、SMTP 等上百個互為關聯的協議,由於 TCP、IP 是兩種常用的底層協議,所以把它們統稱為 TCP/IP 協議族。

資料傳輸方式

計算機之間有很多資料傳輸方式,各有優缺點,常用的有兩種:SOCK_STREAM 和 SOCK_DGRAM。


  • 1) SOCK_STREAM 表示面向連線的資料傳輸方式。資料可以準確無誤地到達另一臺計算機,如果損壞或丟失,可以重新發送,但效率相對較慢。常見的 http 協議就使用 SOCK_STREAM 傳輸資料,因為要確保資料的正確性,否則網頁不能正常解析。
  • 2) SOCK_DGRAM 表示無連線的資料傳輸方式。計算機只管傳輸資料,不作資料校驗,如果資料在傳輸中損壞,或者沒有到達另一臺計算機,是沒有辦法補救的。也就是說,資料錯了就錯了,無法重傳。因為 SOCK_DGRAM 所做的校驗工作少,所以效率比 SOCK_STREAM 高。

QQ 視訊聊天和語音聊天就使用 SOCK_DGRAM 傳輸資料,因為首先要保證通訊的效率,儘量減小延遲,而資料的正確性是次要的,即使丟失很小的一部分資料,視訊和音訊也可以正常解析,最多出現噪點或雜音,不會對通訊質量有實質的影響。

注意:SOCK_DGRAM 沒有想象中的糟糕,不會頻繁的丟失資料,資料錯誤只是小概率事件。

有可能多種協議使用同一種資料傳輸方式,所以在 socket 程式設計中,需要同時指明資料傳輸方式和協議。

綜上所述:IP地址和埠能夠在廣袤的網際網路中定位到要通訊的程式,協議和資料傳輸方式規定了如何傳輸資料,有了這些,兩臺計算機就可以通訊了。

相關推薦

C/C++ socket網路程式設計掃盲

引言 socket 是“套接字”的意思,是計算機之間進行通訊的一種約定,也可以認為是一種技術。通過 socket 這種約定,一臺計算機可以接收其他計算機的資料,也可以向其他計算機發送資料。 socket 的典型應用就是 Web 伺服器和瀏覽器:瀏覽器獲取使用者輸入的URL

DEV C++中Socket網路程式設計

Dev-C++是一個小巧開源的C/C++整合開發環境,對於大部分的Linux函式,都可以在引用標頭檔案後直接呼叫,但開發socket網路程式卻要多做一些工作。 新增 標頭檔案不可以。 新增  #pragma    comment(lib,"ws2_32.lib") 

socket網路程式設計基礎

         首先列舉一下socket網路通訊的例子:使用區域網打遊戲,用瀏覽器連線外網看視訊,使用QQ與好友通訊,手機連線wifi傳資料等等。socket是底層抽象給應用層所使用的一套介面函式,本篇講解這些函式的使用。 物件:1、伺服器server(等待客戶端連線)

socket網路程式設計-高階

7. Netty實現檔案伺服器(基於HTTP協議) 8. 最佳實踐 9. Mina入門基礎 *******************************************************

銀行業務系統(c/s架構、socket網路程式設計、多執行緒)

1、功能要求 包括兩類使用者:管理人員和普通使用者(本文只寫了普通使用者程式) 普通使用者功能:登入登出、存取款、轉賬、查詢餘額 2、技術要求 要求用到多程序多執行緒 要求同時允許多個使用者操作(因為沒有註冊賬號功能,且只初始化了兩個賬號資訊,所以同時只能允許兩個賬號線上)

C#學習筆記(12)- Socket網路程式設計

理解Socket 人通過電話可以通訊 程式之間通過Socket來通訊 套接字就是程式間的電話機 協議就是程式與程式之間的通用語言:TCP與UDP協議 Socket的英文原義是“孔”或“插座”。作為程序通訊機制,取後一種意思。通常也稱作“套接字”,用於描述I

C# Socket網路程式設計

我們在講解Socket程式設計前,先看幾個和Socket程式設計緊密相關的概念: TCP/IP層次模型     當然這裡我們只討論重要的四層        01,應用層(Application):應用層是個很廣泛的概念

12學通C#網路程式設計——第一 基礎之程序執行緒

   在C#的網路程式設計中,程序和執行緒是必備的基礎知識,同時也是一個重點,所以我們要好好的掌握一下。 一:概念           首先我們要知道什麼是”程序”,什麼是“執行緒”,好,查一下baike。   程序:是一個具有一定獨立功能的程式關於某個資料集合的一次

C# Socket網路程式設計之客戶端群發訊息

接上一片部落格,接著socket的學習。此次寫的是伺服器端被多個客戶端連線,並且一個客戶端發訊息,其他連線的客戶端都可接收到。 伺服器端設計思路: 1.要有一個執行緒監聽埠,當有客戶端連線上時,就要產生一個socket物件負責和這個客戶端通訊,此時需要開啟一個執行緒處理與這

C# WinForm基礎三 socket網路程式設計

一、Socket網路程式設計 1、概念:Socket    英文願意是孔或插座。作為BSD UNIX的程序通訊機制,取後一種意思,通常也稱作“套接字”,用於描述IP地址和埠,是一個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同計算機之間的通訊。 2、理解: 客戶端如果要連

windows C++多執行緒程式設計高階 實現執行緒同步

    上一篇文章windows程式設計 使用C++實現多執行緒類僅僅是介紹了怎樣用類來實現多執行緒,這篇文章則重點介紹多執行緒中資料同步的問題。好了,廢話不多說,進入主題。     問題場景:這裡我們假設有這樣一個工作流水線(CWorkPipeline),它不斷的生成一

C語言之網路程式設計(伺服器和客戶端)

1、 套接字:源IP地址和目的IP地址以及源埠號和目的埠號的組合稱為套接字。其用於標識客戶端請求的伺服器和服務。 常用的TCP/IP協議的3種套接字型別如下所示。 (1)流套接字(SOCK_STREAM): 流套接字用於提供面向連線、可靠的資料傳輸服務。該服務將保證資料能夠實現無差錯、無重複傳送,並按順序接

C語言之網路程式設計(一)域名解析

在網路程式設計時,知道域名是不能直接訪問一個主機的,需要轉換成相應的IP地址。有時在程式中需要將一個IP地址轉換成一個域名。本節將講解C程式中的IP地址與域名的轉換問題。 提示:在TCP/IP網路中,通訊雙方的主機必須知道彼此的IP地址方可進行正常的通訊,如果給出的主機的域

C#中Socket通訊程式設計的非同步實現

本文將在C#中Socket同步通訊的基礎上,分析和研究Socket非同步程式設計的實現方法,目的是深入瞭解Socket程式設計的基本原理,增強對網路遊戲開發相關內容的認識。 什麼是Socket程式設計的非同步是實現 所謂Socket程式設計的非同步實現是指按

利用C#進行Socket通訊程式設計之二:一個例項

    利用晚上這點閒暇時間,寫了一個Socket通訊的小例項,該例項包含伺服器端和客戶端。其基本工作流程是:當伺服器啟動服務以後,客戶端進行連線,如果連線成功,則使用者可以在傳送訊息框中輸入待發送的訊

【Matlab】C++和MATLAB混合程式設計-DLL

先小話一下DLL,DLL是動態連結庫,是原始碼編譯後的二進位制庫檔案和程式介面,和靜態連結庫不同的是,程式在編譯時並不連結動態連結庫的執行體,而是在檔案中保留一個呼叫標記,在程式執行時才將動態連結庫檔案載入入記憶體。並且DLL在執行時是共享的,即當多個程式呼叫時,記憶體中也只

java:socket 網路程式設計

socket的通俗解釋: 套接字=主機+埠號。兩個東西配在一起,叫做“配套”。 另外“套”也有對應的意思,它可以把網路上的兩個應用對應起來,所以用“套”。 它是用來與另一個應用連線的,所以用“接”。 又因為它是一小段資料,很小一小段,所以叫“字”。 “套接字",就是一小段用來將網路個兩個應用

[Socket網路程式設計]一個封鎖操作被對 WSACancelBlockingCall 的呼叫中斷。

原文地址:http://www.cnblogs.com/xiwang/archive/2012/10/25/2740114.html記錄在此,方便查閱。 C#中在使用UDPClient迴圈監聽埠,在斷開UPDClient的時候,使用try...catch捕獲了異常,System.NET.Socket

Python_day6:socket網路程式設計

一、socket   socket即套接字,用於描述IP地址和埠,是一個通訊鏈的控制代碼,應用程式通常通過"套接字"向網路發出請求或者應答網路請求。   最簡單的socket,一次 1 import socket 2 server = socket.socket() #獲得例項

python------Socket網路程式設計(二)粘包問題

一.socket網路程式設計  粘包:服務端兩次傳送指令在一起,它會把兩次傳送內容合在一起傳送,稱為粘包,從而出現錯誤。 解決方法:(比較low的方法) 有些需要實時更新的,用sleep有延遲,不能這樣解決問題。 解決方法之高階方法: 客戶端: 二.傳送檔案 ftp s