關於socket的認識理解

2021-07-16 03:03:25 字數 4194 閱讀 3976

**

對tcp/ip、udp、socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問:

1. 什麼是tcp/ip、udp?

2. socket在**呢?

3. socket是什麼呢?

4. 你會使用它們嗎?

什麼是tcp/ip、udp?

tcp/ip(transmission control protocol/internet protocol)即傳輸控制協議/網間協議,是乙個工業標準的協議集,它是為廣域網(wans)設計的。

udp(user data protocol,使用者資料報協議)是與tcp相對應的協議。它是屬於tcp/ip協議族中的一種。

這裡有一張圖,表明了這些協議的關係。    

圖1arp (位址解析協議)是乙個位於tcp/ip協議棧中的底層協議,用於對映計算機的實體地址與網路ip位址。根據主機傳送的ip位址獲取主機的mac位址。

rarp的與arp正好相反

ping(網際網路包探索器)是乙個用於測試網路連線量的程式,它使用icmp(網際網路網控制報文協議)。ping傳送乙個icmp請求資訊給目的地並報告是否收到所希望的icmp應答。來檢查網路是否通暢或者網路連線速度的icmp應答。

icmp與igmp的區別

icmp協議是指英文全稱(internet control message protocol),就是網際控制資訊協議。主要是用於補充ip傳輸資料報的過程中,傳送主機無法確定資料報是否到達目標主機。icmp報文分為出錯報告報文和查詢報文兩種。若資料報不能到達目標主機,icmp出錯報告報文可以以回送資訊的方式,向源主機發去資訊,並不能糾正資料報中的任何出錯。除了出錯報告,icmp還可以診斷出某些網路問題,這就是icmp的查詢報文。

而igmp協議是指英文全稱(internet group management protocol),網路組管理協議。主要用於建立和管理多播組,對ip分組廣播進行控制。

其次兩者的區別:

internet控制訊息協議icmp是用於報告錯誤並代表ip對訊息進行控制。ip運用互聯組管理協議igmp來告訴路由器,某一網路上指導組中的可用主機。icmp源抑制訊息:當tcp/ip主機傳送資料到另一主機時,如果速度達到路由器或者鏈路的飽和狀態,路由器發出乙個icmp源抑制訊息。

tcp/ip協議族包括運輸層、網路層、鏈路層。現在你知道tcp/ip與udp的關係了吧。

socket在**呢?

在圖1中,我們沒有看到socket的影子,那麼它到底在**呢?還是用圖來說話,一目了然。

圖2原來socket在這裡。

socket是什麼呢?

socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面(facade)模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。

你會使用它們嗎?

前人已經給我們做了好多的事了,網路間的通訊也就簡單了許多,但畢竟還是有挺多工作要做的。以前聽到socket程式設計,覺得它是比較高深的程式設計知識,但是只要弄清socket程式設計的工作原理,神秘的面紗也就揭開了。

乙個生活中的場景。你要打**給乙個朋友,先撥號,朋友聽到**鈴聲後提起**,這時你和你的朋友就建立起了連線,就可以講話了。等交流結束,結束通話**結束此次交談。    生活中的場景就解釋了這工作原理,也許tcp/ip協議族就是誕生於生活中,這也不一定。

圖3先從伺服器端說起。伺服器端先初始化socket,然後與埠繫結(bind),對埠進行監聽(listen),呼叫accept阻塞,等待客戶端連線。在這時如果有個客戶端初始化乙個socket,然後連線伺服器(connect),如果連線成功,這時客戶端與伺服器端的連線就建立了。客戶端傳送資料請求,伺服器端接收請求並處理請求,然後把回應資料傳送給客戶端,客戶端讀取資料,最後關閉連線,一次互動結束。

服務端的socket與固定的埠相連,而客戶端的socket所連線的埠不固定。

在這裡我就舉個簡單的例子,我們走的是tcp協議這條路(見圖2)。例子用mfc編寫,執行的介面如下:

圖4

圖5在客戶端輸入伺服器端的ip位址和傳送的資料,然後按傳送按鈕,伺服器端接收到資料,然後回應客戶端。客戶端讀取回應的資料,顯示在介面上。

下面是接收資料和傳送資料的函式:

int receive(socket fd, char *sztext, int len)

if(rc == 0)

sztext += rc;

cnt -= rc;

}return len;

}int send(socket fd, char *sztext, int len)

if(rc == 0)

sztext += rc;

cnt -= rc;

}return len;

}

伺服器端:

在伺服器端,主要是啟動socket和監聽執行緒。

#define default_port 2000

void cserverdlg::onstart()

//將本地位址繫結到所建立的套接字上

if(bind(m_listening, (lpsockaddr) & local, sizeof(local)) == socket_error )

//建立監聽執行緒,這樣也能響應介面上操作。

m_hlistenthread = ::createthread(null, 0, listenthread, this, 0, &dwthreadid);

m_startbtn.enablewindow(false);

m_stopbtn.enablewindow(true);}//

監聽執行緒函式:

dword winapi cserverdlg::listenthread(lpvoid lpparam)

char szbuf[max_path];

//初始化 memset(szbuf,0,max_path);

while(1)

return

0;}

伺服器端一直在監聽是否有客戶端連線,如有連線,處理客戶端的請求,給出回應,然後繼續監聽。

客戶端:

客戶端的傳送函式:

#define default_port 2000

void cclientdlg::onsend()

//傳送請求,為簡單只發100位元組,在伺服器端也規定100位元組。

send(sockettmp, sztext, 100);

//讀取伺服器端返回的資料。

memset(sztext,0,max_path);

//接收伺服器端的回應。

receive(sockettmp, sztext, 100);

tchar szmessage[max_path];

memset(szmessage, 0, max_path);

strcat(szmessage, sztext);

//介面上顯示回應資料。

m_replybtn.setwindowtext(szmessage);

closesocket(sockettmp);

}

客戶端就乙個函式完成了一次通訊。在這裡ip位址為何用127.0.0.1呢?使用這個ip位址,伺服器端和客戶端就能執行在同一臺機器上,這樣除錯方便多了。當然你可以在你朋友的機器上執行server程式(本人在區域網中測試過),在自己的機器上執行client程式,當然輸入的ip位址就該是你朋友機器的ip位址了。

簡單的理論和實踐都說了,現在socket程式設計不神秘了吧?希望對你有些幫助。     

關於CRM的理解和認識

crm 專案是乙個長期的旅程,不可能一蹴而就,必須作為階段性的有組織來進行,這樣每過一段時間就能有一段時間的收益。從呼叫中心到市場營銷 銷售 服務全都要有,一次到位很難做到 實施crm 重要的是設定正確的策略,企業必須要整合自己的流程和業務操作方法來滿足這個策略。你是不是已經有了乙個以客戶為中心的遠...

Socket的簡單認識

socket又稱 套接字 網路上的兩個程式通過乙個 雙向的通訊連線實現資料的交換 這個連線的一端稱為乙個 socket。應用程式通常通過 套接字 向網路發出請求或者應答網路請求 網路通訊的要素 網路上的請求就是通過 socket 來建立連線然後互相通訊 ip位址 網路上主機裝置的 唯一標識 埠號 定...

Socket初學認識 Socket模型

socket實際上代表的是網路通訊的乙個端點,通過socket,使用者所開發的應用程式可以通過網路和其他socket應用程式通訊。socket是網路的i o基礎,也可以將它與unix的管道或者檔案模擬。應用程式需要與遠端主機連線時,應建立乙個socket,之後通過socket與遠端應用程式建立連線,...