socket 網路程式設計

2022-02-23 23:01:31 字數 2765 閱讀 2090

http協議的報文要通過tcp/ip來傳輸

socket 的原意是「插座」,在計算機通訊領域,socket 被翻譯為「套接字」,它是計算機之間進行通訊的一種約定或一種方式。通過 socket 這種約定,一台計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。為了與遠端計算機進行資料傳輸,需要連線到網際網路,而 socket 就是用來連線到網際網路的工具。

socket起源於unix,而unix基本哲學之一就是「一切皆檔案」,都可以用「開啟open –> 讀寫write/read –> 關閉close」模式來操作。socket就是該模式的乙個實現,網路的socket資料傳輸是一種特殊的i/o,socket也是一種檔案描述符。socket也具有乙個類似於開啟檔案的函式呼叫:socket(),該函式返回乙個整型的socket描述符,隨後的連線建立、資料傳輸等操作都是通過該socket實現的。

常用的socket型別有兩種:流式socket(sock_stream)和資料報式socket(sock_dgram)。流式是一種面向連線的socket,針對於面向連線的tcp服務應用;資料報式socket是一種無連線的socket,對應於無連線的udp服務應用。

socket 的典型應用就是 web 伺服器和瀏覽器

linux 下的**,server.cpp 是伺服器端**,client.cpp 是客戶端**,要實現的功能是:客戶端從伺服器讀取乙個字串並列印出來。

伺服器端** server.cpp:

#include #include 

#include

#include

#include

#include

#include

in.h>

intmain()

客戶端** client.cpp:

#include #include 

#include

#include

#include

#include

intmain()

linux 下的 socket() 函式

在 linux 下使用 標頭檔案中 socket() 函式來建立套接字,原型為:

int socket(int af, int type, int protocol);
1) af 為位址族(address family),也就是 ip 位址型別,常用的有 af_inet 和 af_inet6。af 是「address family」的簡寫,inet是「inetnet」的簡寫。af_inet 表示 ipv4 位址,例如 127.0.0.1;af_inet6 表示 ipv6 位址,例如 1030::c9b4:ff12:48aa:1a2b。

大家需要記住127.0.0.1,它是乙個特殊ip位址,表示本機位址,後面的教程會經常用到。

你也可以使用 pf 字首,pf 是「protocol family」的簡寫,它和 af 是一樣的。例如,pf_inet 等價於 af_inet,pf_inet6 等價於 af_inet6。
2) type 為資料傳輸方式/套接字型別,常用的有 sock_stream(流格式套接字/面向連線的套接字) 和 sock_dgram(資料報套接字/無連線的套接字)

3) protocol 表示傳輸協議,常用的有 ipproto_tcp 和 ipptoto_udp,分別表示 tcp 傳輸協議和 udp 傳輸協議。

有了位址型別和資料傳輸方式,還不足以決定採用哪種協議嗎?為什麼還需要第三個引數呢?

正如大家所想,一般情況下有了 af 和 type 兩個引數就可以建立套接字了,作業系統會自動推演出協議型別,除非遇到這樣的情況:有兩種不同的協議支援同一種位址型別和資料傳輸型別。如果我們不指明使用哪種協議,作業系統是沒辦法自動推演的。

本教程使用 ipv4 位址,引數 af 的值為 pf_inet。如果使用 sock_stream 傳輸資料,那麼滿足這兩個條件的協議只有 tcp,因此可以這樣來呼叫 socket() 函式:

int tcp_socket = socket(af_inet, sock_stream, ipproto_tcp);  //ipproto_tcp表示tcp協議
這種套接字稱為 tcp 套接字。

如果使用 sock_dgram 傳輸方式,那麼滿足這兩個條件的協議只有 udp,因此可以這樣來呼叫 socket() 函式:

int udp_socket = socket(af_inet, sock_dgram, ipproto_udp);  //ipproto_udp表示udp協議
這種套接字稱為 udp 套接字。

上面兩種情況都只有一種協議滿足條件,可以將 protocol 的值設為 0,系統會自動推演出應該使用什麼協議,如下所示:

int tcp_socket = socket(af_inet, sock_stream, 0);  //建立tcp套接字

int udp_socket = socket(af_inet, sock_dgram, 0); //建立udp套接字

tcp建立連線時要傳輸三個資料報,俗稱三次握手(three-way handshaking)。可以形象的比喻為下面的對話:

網路程式設計 Socket程式設計

一 網路部分 1.ip 2.埠號 在網路協議中使用埠號識別主機上不同的程序,不同的埠對應於不同的服務 應用程式 3.協議 tcp二 socket部門socket通訊基本流程圖 根據socket通訊基本流程圖,總結通訊的基本步驟 伺服器端 第一步 建立乙個用於監聽連線的socket對像 第二步 用指定...

socket網路程式設計

首先認識乙個表示主機資訊的結構體 struct hostent h addrtype 這是表示主機所使用的位址型別的定義,在c語言winsock2.h標頭檔案中以 af 開頭的巨集定義就是它的值。如果使用的是ipv4,則值為 af inet 如果是ipv6,值為 af inet4 h length ...

Socket網路程式設計

socket 網路程式設計 在c free中建立乙個對話方塊工程,取名socket1,建立如下檔案結構 main.h ifndef main h define main h include bool winapi main proc hwnd hwnd,uint umsg,wparam wparam...