MFC 車牌識別 小學期作業 part4

2021-07-04 19:53:15 字數 2585 閱讀 1352

socket(套接字)是現在常用的網路通訊的方法,每一種語言都規定了自己的套接字的類,方法和使用規則,但大體上他們都是一樣的。

分類的話有tcp和udp,tcp是接收到一方傳送訊息,需得到另一方的確認資訊才會繼續下一步工作的一種協議,而udp這是發了之後,完全不管對方接不接受得到,就自顧自地下一步了,所以說tcp安全可靠一點,但慢,udp不可靠,但是速度快。

mfc自己封裝了乙個socket的類,叫csocket,是一種tcp的協議做這個作業的時候著急,沒好好找資料,我只會一種是同步阻塞式的**,效率低。軟體在開始監聽後會阻塞,進入假死狀態,和不好用,後來在網上查到可以用多執行緒解決這個問題,自己摸索了一下,結果雖然沒有達到期望的最大值,但解決了假死的問題。

以下就是我不夠專業,但是親身經歷的網路通訊的知識。

首先是tcp為了安全可靠的乙個規定;三次握手

即客戶端傳送一次資訊到服務端,服務端確認,回傳資訊給客戶端,客戶端再傳遞資訊給服務端的這樣必經過程的乙個規定。

用mfc的csocket類的**說的話,就是幾個函式。

if (!afxsocketinit())

這段。以下是過程:行文順序按照csoket的三次握手順序。

一、服務端: 一、1.建立乙個cscoket的物件,因為是服務端,所以必須要指定ip和埠,使用這個函式的乙個過載

mysercsocket.create(80,1,l"127.127.127.127");

一、2.監聽是否有客戶端連線進來,使用函式mysercsocket.listen();

說明:引數,預設為5,返回值表明是否有客戶端連線。這個函式是阻塞的,沒有連線的話會卡死在這裡。

二、客戶端: 二、1.建立乙個csocket的物件,客戶端建立不需要有引數。myclicsocket.create();

二、2.連線服務端myclicsocket.connect(l"127.127.127.127",80);

說明:第乙個引數:ip;第二個引數:埠;返回值表明是否連線成功。

說明:引數:乙個csocket的物件,用於處理已連線的客戶端,而mysercsocket會繼續監聽新的客戶端連線,不管這乙個已連線的了;返回值表示是否成功。這個函式也是阻塞的,沒有接收到會卡死。

客戶端: 二、3.如果連線成功的話,就要傳資料了,使用函式myclicsocket.send(str,1024);

說明:引數一:傳送的字串;引數二:字串的長度;返回值表示成功傳送的字串。

服務端: 二、4.服務端接收資料,使用函式mysercsocket.receive(str,1024);

說明:第乙個引數:接受用到的字串;第二個引數要接受的字串長度;返回值表示成功接受的字串大小。該函式阻塞。

傳送完後關閉套接字:

客戶端: 一、4.使用函式myclicsocket.close();

服務端: 二、5.使用函式mysercsocket.close();

乙個例項:

服務端**,寫在乙個button的單擊事件裡:

void cserdlg::onbnclickedbuttonser()

if(mysercsocket.listen())

else messagebox(_t("監聽失敗"));

mysercsocket.close();

}客戶端**,寫在乙個button裡: void cclidlg::onbnclickedbuttoncli()

if(myclicsocket.connect(l"127.127.127.127",800))

}else messagebox(_t("連線失敗"));

myclicsocket.close();

}以上內容完成了mfc下csocket的基本使用,但我們發現這種方式的使用得到的網路連線是阻塞式的,服務端接收不到資訊會假死,怎麼辦?

網上查了查,說是要用多執行緒解決,我對這個也嘗試了一下。

多執行緒初試(未完整版)//沒有完整版,我不會(攤手)

在需要開啟新執行緒的函式裡加入如下語句:

socket temp;

temp=mysercsocket.detach();

afxbeginthread(thread,this);

mysersocket.attach(temp);

大致意思是先將當前關於網路通訊的執行緒解除關聯(別問我什麼關聯,我不知道),然後開啟新執行緒,也就是乙個函式thread,然後再次回來繫結執行緒(這裡有乙個問題,當我用斷點測試的時候發現,這裡的函式不是按順序執行的,到afxbeginthread(thread,this)後程式不會進入thread,而是繼續向下執行,該函式執行完才進入thread)。

相應的,我們需要寫一下thread的函式,這是乙個與執行緒有關的函式,格式有要求, static uint thread(lpvoid   p) //格式必須是這樣,其中p是任意型別指標,在函式內被轉化成視窗類的指標

/傳入指標/

csocketserdlg* dlg=(csocketserdlg*)p;

csocket msock;

msock.create();

獲得控制代碼///

msock.attach(dlg->mysercsocket);

}這樣子用可以達到介面不假死的效果,但不可以同時接受多個請求,所以是不完整版。

小學期鍊錶作業

include include include using namespace std class linknode class link linknode link create else cout 輸入資料 n cin data return phead void link list linkn...

HNU大一小學期作業三 棋盤

題目 問題描述 棋盤是指乙個行和列編號從1 n的nxn的二進位制矩陣,當行號和列號之和為偶數時該矩陣對應位置為黑色的 1 否則為白色的 0 以下圖示為n 1 2 3時的棋盤。給出乙個nxn的二進位制矩陣,請找出位於該矩陣內的最大尺寸的完整棋盤,以及最大尺寸棋盤的數量 棋盤可以交疊 輸入形式 每個測試...

c 小學期大作業攻略(二)整體思路 主介面

寫在前面 如果我曾經說過要在第一周之內寫完大作業,那 肯定是你聽錯了。不過如果我在寫的時候有攻略看的話應該可以輕鬆地在4 5天內做完,然後覺得寫攻略的人是個小天使吧 瘋狂暗示 出於給大家自由發揮的考慮,本文略去了很多細節,如果按照本攻略行進過程中遇到任何問題請盡可能告知我,一來相互提供新的思路,二來...