TCP只是一個可靠傳輸的通信管道,上層協議要你自己定的,通俗來說就是發送方和接收方的約定
自定義協議的核心有兩個:
1. 控制碼
2. 流程控制
用Socket進行通信,發送的數據包一定是有結構的,類似於:數據頭+數據長度+數據內容+校驗碼+數據尾。
這個你定義一個Struct包裝起來即可。
控制碼是協議的基礎信息,主要用來解釋數據包的基本信息,通信觸發的動作等,以便告知收到數據包之后應該如何處理數據包。
例如,你傳輸文件的時候,一般會經過“傳輸開始 - 傳輸中 - 傳輸結束”三個階段,那么Sender針對不同的階段就要定義不同的命令控制碼,以便讓Receiver知道傳輸處於什么過程,這樣Receiver收到數據包之后便可以知道下一步該做什么。
具體實現上類似於:
switch(iCmdType)
{
case CMD_BEGIN_TRANSFER:
Begin();
break;
case CMD_TRANSFERRING:
Transfer();
break;
case CMD_FINISH_TRANSFER:
Finish();
break;
......
}
而流程控制是協議的核心所在。以TCP/IP為例,Client和Server如何知道雙方已經正確建立了連接?答案就是“三次握手”。三次握手就是流程控制。這個就需要對應用程序的通信流程把握的非常熟悉。
以你的問題為例,“把數據從工控機(wince)系統 發送到服務器中(xp)中”,XP如何判斷已經完整而且無誤地收到了一個來自於wince的數據包?答案就是靠自定義的協議控制碼(數據長度)。收到的數據如果是正確的,回應什么給wince?是錯誤的,又該回什么給wince?這就要靠協議所定義的流程控制。
socket只管將數據從一個地方傳遞到另外一個地方,至於數據是什么,做什么用途的,socket不需要知道。這樣的話,你就需要在應用層自己定一些協議,用來解析你自己的數據。
例如可以定一個協議頭
typedef struct Header
{
BYTE protocal; // 協議號
。。。
。。。
}DataHeader, *LPDataHeader;
這樣只要你的數據傳到了應用層,直接取出這個結構體,確定里面的協議號,就可以知道你的是什么數據了。
以便處理數據!
協議的本質是定義各個實體對象之間的交互規則。
這個你拿到現實之中也是一樣的,開個玩笑,像什么《中蘇XXX同盟友好互助協議》之類的(你認為和Socket有關系嗎?哈哈~~~)
我覺得你是卡在怎么實現一個協議上了,事實上你只要能編寫傳統的 C/S 通信程序,那么定義一個應用層協議真的不是很難的事,只不過差別在於協議定義的水平(經驗豐富的人定義的協議移植性、可靠性、可擴充性等會好很多,而經驗不是很豐富的人定義出來可能只能在某些機器上Work,在另外一些機器上就Bug了...不過這還好,因為水平是可以積累提高的)
給你個鏈接:http://download.csdn.net/source/2174418
這是我實現的一個精簡的不能再精簡的ftp協議(內網傳輸,一對一),我甚至連什么封包拆包的操作都簡化到最低了。你看了就知道定義一個協議並不是你想的那么難。當然了,我這個協議定義的很爛,哈哈,因為我寫這個程序的目的就是替代QQ在內網傳大文件的功能(QQ在內網傳幾個G的文件經常是開始10M/S,很快,但逐漸逐漸的就慢下來,最后干脆卡在那不動,這讓我們這些經常分享不良資源的童鞋情何以堪啊~~)。夠用就好,所以沒有加太多無謂的功能。
我覺得你應該把注意力轉移到如何讓程序Work起來,你一邊做一邊想 C 和 S 之間如何才能正確、可靠、高效地通信,這樣等你把程序寫完了,你也基本就知道協議應該怎么定義了。(雖然這樣按軟件工程來看有點本末倒置呵,不過實際就是這樣,設計往往是和實現迭代進行的)