思華CP介面協議 Socket包定義

2021-04-13 05:15:11 字數 4816 閱讀 4134

思華cp介面socket協議

2007-6-20

1. 首先需要確認你拿到的是這個版本的協議,其它版本我不敢保證能行.

2. 思華定義的socket傳送包我是頭是遇到,搞不懂怎麼回事,除錯了三天,終於弄明白他是啥意思

3. head 1位元組 (byte型別),  len 2位元組 (int16、short型別,具體看語言決定,我這裡列舉的是.net和vb裡的), context 具本看辦議規定

4. 我用vb.net 2.0開發,將上面的定義寫成結構,再將結構轉成byte陣列,現在網上有.net下的轉換函式(struct2bytes),可以自己搜一下,csdn裡也有。現在我們來看看.net下對思華登入結構的定義:

#region "定義登入"

_public structure login

public head as byte

_public len() as byte

_public account() as byte

_public password() as byte

end structure

#end region

這裡有個問題。 head 是byte型別的,在轉換後必須還是byte型別,而且是一位元組。比如說head=1 那麼socket的傳送buff頭一位元組就是1, 而並不是ascii碼的49。

len就更奇怪了。在socket的傳送buff裡佔索引號的1 2位(也就是兩位元組)。 如果你直接把len宣告為int16、short或其它兩位元組的整型話,經結構轉為byte陣列的結果是三位。比如len=60,buff看到的就是 0 60 0,那麼登入的傳送buff那就是10

600xx

xx這樣的話傳過去就不對,而且最明顯的就是呼叫同步socket的send方法是會阻塞幾秒鐘,如要按正確的方式傳送不會造成阻塞,我想他那邊應該是非同步接收。這就奇怪了,.net 和 vc寫的結構轉成buff都是這樣,那麼很明顯就是寫協議的人規定有問題,這裡我不禁要狠狠b4一下。

所以我上面在登入結構中定義的len寫的是二位元組的byte,因為這裡需要手動轉換。而且轉換還必須是高低位相反,簡直沒搞懂。比如 len = 60那麼buff裡就應該是160

0一般的程式處理出來應該是10

60這就太扯巴子了,所以我用了vb裡的特有的redim語法轉換一下

dim len() as byte

len = system.text.encoding.ascii.getbytes(chr(60))

redim preserve len(1)

這時len(0) = 60, len(1)=0

其實也不用這麼麻煩,因為結構傳送一般都是定長,所以你也可以直接給len陣列賦值。

但如果長度超出128的話也會有問題,所以就以滿256進1的原則來手動算吧,反正他定長,一般不會變。

比如傳送簡訊的包是550,那麼長度應該是

len(0) = 38

len(1) = 2

256*2+38=550,清楚了嗎。2就是len(1)裡的

接下來就是context,這個比較簡單,轉化為一般的ascii陣列就行

system.text.encoding.ascii.getbytes("思華寫的很laji")。

接收思華主控發往cp的時候。

context可以用char()來替代,這樣省去一道自行將byte()轉為string的工序

我的接收登入響應的結構定義

#region "定義登入響應"

_public structure loginreq

public head as byte

public len as int16

public context as char

end structure

#end region

以下附上我的乙個封裝結構定義類 .net 2.0的

(msgstructure.vb)

imports system.runtime.interopservices

#region "定義登入"

_public structure login

public head as byte

_public len() as byte

_public account() as byte

_public password() as byte

end structure

#end region

#region "定義登入響應"

_public structure loginreq

public head as byte

public len as int16

public context as char

end structure

#end region

#region "定義下行結構"

_public structure send

public head as byte

_public len() as byte

public context as sendcontext

end structure

#end region

#region "定義下行內容體"

_public structure sendcontext

'(移動cmpp,電信**gp,聯通sgip,網通sngp)

_public msgkind() as byte

'內部資訊標識

_public linkno() as byte

'相同msg_id的資訊總條數,預設為1

_public pktotal() as byte

'相同msg_id的資訊序號,預設為1

_public pknumber() as byte

'計費使用者型別

_public feeusertype() as byte

'業務**

_public servicecode() as byte

'計費型別

_public feetype() as byte

'費用**(1元用100表示)

_public feecode() as byte

'包月費/封頂費

_public fixedfee() as byte

'贈送費用

_public givenvalue() as byte

'收費使用者號碼

_public feeterminalid() as byte

'收費使用者號碼型別,預設為0

_public feeterminalidtype() as byte

'資訊格式 (15代表包含漢字,一般用15)

_public msgfmt() as byte

'內部的有效期時間 (過期時間)

_public validtime() as byte

'內部的執行時間 (定時傳送)

_public attime() as byte

'傳送號碼(此處為sp的埠+長號碼)

_public srcid() as byte

'接收號碼

_public destid() as byte

'接收號碼型別, 收費使用者號碼型別(0真實號碼,1偽碼)預設為0

_public destidtype() as byte

'資訊內容

_public msgcontent() as byte

'上行資訊的linkid,無上行不填

_public linkid() as byte

'簡訊型別

_public msgtype() as byte

'sp**

_public spcode() as byte

'serviceid

_public serviceid() as byte

end structure

#end region

#region "定義上行內容體"

_public structure receiveupcontext

'內部資訊標識

_public linkno() as char

'msgid

_public msgid() as char

'接收號碼

_public destid() as char

'接收號碼型別(0、真實號碼,1、偽碼)

public destidtype as char

'傳送號碼

_public srcid() as char

'傳送號碼型別(0、真實號碼,1、偽碼)

public srcidtype as char

'業務**

_public servicecode() as char

'資訊格式 (15代表包含漢字)

_public msgfmt() as char

'資訊內容

_public msgcontent() as char

'點播業務使用的linkid,非點播類業務的mt流程不使用該欄位

_public linkid() as char

end structure

#end region

#region "心跳下行結構"

_public structure heartjump

public head as byte

_public len() as byte

_public context() as byte

end structure

#end region

socket協議的介面測試方法

1.loadrunner使用socket協議寫c呼叫底層socket協議資料 2.jmeter新增websocket相關依賴包,可以新增websocket協議的sampler 3.專門的socket協議測試工具,比如socket工具,tcpudptest等工具。tcpudptest無法設定併發資料量...

TCP IP協議Http協議Socket的區別

tpc ip協議是傳輸層協議,主要解決資料如何在網路中傳輸,而http是應用層協議,主要解決如何包裝資料。關於tcp ip和http協議的關係,網路有一段比較容易理解的介紹 我們在傳輸資料時,可以只使用 傳輸層 tcp ip協議,但是那樣的話,如果沒有應用層,便無法識別資料內容,如果想要使傳輸的資料...

網路協議(二) Socket

socket是為了實現以上的通訊過程而建立成來的通訊管道,其真實的代表是客戶端和伺服器端的乙個通訊程序,雙方程序通過socket進行通訊,而通訊的規則採用指定的協議。socket只是一種連線模式,不是協議,socket是對tcp ip協議的封裝,socket本身並不是協議,而是乙個呼叫介面 api ...