C 利用Socket實現C S模式通訊

2021-10-14 17:37:49 字數 3866 閱讀 5165

首先我們要了解一下幾點內容:

簡單來說:tcp控制傳輸資料,負責發現傳輸的問題,一旦有問題就發出訊號,要求重新傳輸,直到所有資料安全正確地傳輸到目的地,而ip是負責給網際網路中的每一台電腦定義乙個位址,以便傳輸。從協議分層模型方面來講:tcp/ip由:網路介面層(鏈路層)、網路層、傳輸層、應用層。它和osi的七層結構以及對於協議族不同,下圖簡單表示:

現階段socket通訊使用tcp、udp協議,相對應udp來說,tcp則是比較安全穩定的協議了。本文只涉及到tcp協議來說socket通訊。首先講述tcp/ip的三次握手,在握手基礎上延伸socket通訊的基本過程。

下面介紹對於應屆生畢業面試來說是非常熟悉的,同時也是最臭名昭著的三次握手:

1 客戶端傳送syn報文到伺服器端,並置傳送序號為x。

2 伺服器端接收到客戶端傳送的請求報文,然後向客戶端傳送syn報文,並且傳送確認序號x+1,並置傳送序號為y。

3 客戶端受到伺服器傳送確認報文後,傳送確認訊號y+1,並置傳送序號為z。至此客戶端和伺服器端建立連線。

在此基礎上,socket連線過程:

伺服器監聽:伺服器端socket並不定位具體的客戶端socket,而是處於等待監聽狀態,實時監控網路狀態。

客戶端請求:客戶端clientsocket傳送連線請求,目標是伺服器的serversocket。為此,clientsocket必須知道serversocket的位址和埠號,進行掃瞄發出連線請求。

連線確認:當伺服器socket監聽到或者是受到客戶端socket的連線請求時,伺服器就響應客戶端的請求,建議乙個新的socket,把伺服器socket傳送給客戶端,一旦客戶端確認連線,則連線建立。

注:在連線確認階段:伺服器socket即使在和乙個客戶端socket建立連線後,還在處於監聽狀態,仍然可以接收到其他客戶端的連線請求,這也是一對多產生的原因。

下圖簡單說明連線過程:

伺服器端介面和**:

thread threadwatch = null; // 負責監聽客戶端連線請求的 執行緒;

socket socketwatch = null;

dictionarydict = new dictionary();

dictionarydictthread = new dictionary();

private void btnbeginlisten_click(object sender, eventargs e)

catch (socketexception se)

// 設定監聽佇列的長度;

socketwatch.listen(10);

// 建立負責監聽的執行緒;

threadwatch = new thread(watchconnecting);

threadwatch.isbackground = true;

threadwatch.start();

showmsg("伺服器啟動監聽成功!");

btnbeginlisten.enabled = false;

}/// /// 監聽客戶端請求的方法;

///

void watchconnecting()

}void recmsg(object sokconnectionparn)

catch (socketexception se)

catch (exception e)

if (arrmsgrec[0] == 0) // 表示接收到的是資料;

if (arrmsgrec[0] == 1) // 表示接收到的是檔案;}}

}

}void showmsg(string str)

// 傳送訊息

private void btnsend_click(object sender, eventargs e)

else

}/// /// **訊息

///

///

/// 訊息

private void btnsendtoall_click(object sender, eventargs e)

showmsg(strmsg);

txtmsgsend.clear();

showmsg(" **完畢!");

}// 選擇要傳送的檔案

private void btnselectfile_click_1(object sender, eventargs e)

}// 檔案的傳送

private void btnsendfile_click_1(object sender, eventargs e)

else

else}}

txtselectfile.clear();

}private void btnnewclientform_click(object sender, eventargs e)

客戶端介面和**:

thread threadclient = null; // 建立用於接收服務端訊息的 執行緒;

socket sockclient = null;

private void btnconnect_click(object sender, eventargs e)

catch (socketexception se)

showmsg("與伺服器連線成功!!!");

threadclient = new thread(recmsg);

threadclient.isbackground = true;

threadclient.start();

btnconnect.enabled = false;

}void recmsg()

catch (socketexception se)

catch (exception e)

if (arrmsgrec[0] == 0) // 表示接收到的是訊息資料;

if (arrmsgrec[0] == 1) // 表示接收到的是檔案資料;}}

catch (exception aaa)}}

}void showmsg(string str)

// 傳送訊息;

private void btnsendmsg_click(object sender, eventargs e)

// 選擇要傳送的檔案;

private void btnselectfile_click(object sender, eventargs e)

}//向伺服器端傳送檔案

private void btnsendfile_click(object sender, eventargs e)

else

}

}private void frmclient_formclosing(object sender, formclosingeventargs e)

實現通訊結果:

C 利用行為模式實現socket非同步通訊(一)

背景 專案中存在多個socket,按找型別分為兩類 一是條碼掃瞄裝置,第二種是輸送裝置。條碼掃瞄裝置負責條碼採集,是允許接收資料,不存在傳送資料的情況。輸送裝置既可以接收資料,也可以傳送資料。並且,輸送裝置存在多種動作或者流程 入 出 盤點,每種動作對應的邏輯處理都不相同。同時考慮存在以後裝置數量和...

C 基於Socket的CS模式的完整例子

基於socket伺服器端實現本例主要是建立多客戶端與伺服器之間的資料傳輸,首先設計伺服器。開啟vs2008,在d c ch17目錄下建立名為socketserver的windows應用程式。開啟工程,往當前窗體中新增控制項,如表17 6所示。表17 6 新增控制項列表 控 件 name text l...

C 基於Socket的CS模式的完整例子

基於socket伺服器端實現本例主要是建立多客戶端與伺服器之間的資料傳輸,首先設計伺服器。開啟vs2008,在d c ch17目錄下建立名為socketserver的windows應用程式。開啟工程,往當前窗體中新增控制項,如表17 6所示。表17 6 新增控制項列表 控 件 name text l...