思華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 ...