*MUTEX(互斥體) [#u3cf670d]
SSP存在確認的方法~
SSP啟動時,創建名為"ssp"的MUTEX.下可由此確認SSP是否啟動。
 m_hMutex = ::OpenMutex(MUTEX_ALL_ACCESS,FALSE,"ssp");
 if(m_hMutex){
    //SSP已啟動
 }
 else{
    //SSP未啟動
 }

另外,因為Materia等平台對應的MUTEX名為"sakura"。~
在SSP的設置裡可以勾選生成名為"sakura"的Mutex來模擬Materia。 (SSP/1.09.00 Pre8追加)~
例如:
 hmutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sakura");
 if (hmutex==0) {
  // 不存在
 } else {
  // 存在
  CloseHandle(hmutex);
 }


FMO寫入、讀出時的互斥性可以利用名為"SakuraFMO"的Mutex(SSP/1.08.00追加)加鎖。~
可以對讀寫衝突所造成的數據破壞和數據不完全讀出進行有效的阻止,建議在啟動時取得。~

代碼用例:
 
 HANDLE hMutex = CreateMutex(NULL,FALSE,"SakuraFMO");
 if ( hMutex == NULL ) { 錯誤處理; } 
 if ( WaitForSingleObject(hMutex, 1000) != WAIT_TIMEOUT ) {
   //FMO讀寫;
  ReleaseMutex(Mutex);
 }
 CloseHandle(Mutex);
 
此外、如果處理中的進程帶著Mutex異常結束、WaitForSingleObject返回WAIT_ABANDONED。~
請注意不要忘記和WAIT_OBJECT_0經行比較。~

*File Mapping Objects [#la35e287]
當SSP等偽春菜平台運行時會創建一個特定的內存對象。~
所有其他進程可以從這個內存對像中以低成本獲取人格的資料信息。~
默認該filemapping對象名為"sakura",SSP可通過設置變更FMO名(SSP/1.09.00追加)~
內存映射結構~
0-3 長度值。指定大小。~
4- 數據主體~

主體數據格式~
主體是連續的一個項目挨著一個項目。~
項目形式如下:~
[ID].項[1]值[13][10]~

例如:
 ssp_fmo_header_0000108c_00110554.hwnd [1] 1115476
 ssp_fmo_header_0000108c_00110554.name [1] Emily
 ssp_fmo_header_0000108c_00110554.keroname [1] Teddy
 ssp_fmo_header_0000108c_00110554.path [1] Z:\ssp\
 ssp_fmo_header_0000108c_00110554.sakura.surface [1] 5
 ssp_fmo_header_0000108c_00110554.kero.surface [1] 10
 ssp_fmo_header_0000108c_00110554.kerohwnd [1] 591248
 ssp_fmo_header_0000108c_00110554.hwndlist [1] 1115476,591248,787914,787868,656814
 ssp_fmo_header_0000108c_00110554.ghostpath [1] Z:\ssp\ghost\emily4\

數據的意義~
[ID]在項名稱之前用"."分隔範圍。項名和值是由字符0x01分隔。一行的終止是回車(CR:字符0x0D)+換行(LF:字符0x0A)。~
[ID]為SSP的標識,形式為~
ssp_fmo_header_[進程ID-16進制]_[Sakura側hwnd-16進制]~
樣子的32字節字符串生成,作為毎個人格的唯一標識。可以通過SHIORI Event的uniqueid(即SSP/HF3.0追加的ID,SSP/HF3.2更名為uniqueid)獲得。~
注:Materia以進程ID的MD5值作為[ID],但是由於SSP的1個進程建立了複數個人格,所以未使用~

有效項如下:
|[ID].hwnd | 人格主窗口句柄|
|[ID].name | 活動的人格名稱|
|[ID].keroname | 活動的kero側人格名稱|
|[ID].path | SSP主程序的路徑|
|[ID].sakura.surface | 主人格surface編號(SSP/2.01.47後復活)|
|[ID].kero.surface | kero側人格surface編號(SSP/2.01.47後復活)|
|[ID].kerohwnd | kero側的hwnd存放unsigned int值。|
|[ID].hwndlist | 逗號分隔至\0的hwnd(無符號數值)列舉,無效窗口為0。 (SSP/2.02.33追加)|
|[ID].ghostpath | 人格所在文件的路徑(SSP/1.04.07追加)|

數據大小~
暫時的數據大小為1024 * 64個字節。數據的大小也有一個長度值。因此,真正的大小為(1024 * 64) - 4個字節。~

yaya可以使用READFMO函數讀取FMO,詳細可見yaya的說明。[[READFMO>開發文件/SHIORI/AYA/AYA系統函式參照表#READFMO]]~

*SAKURA API [#l02f74ca]
詳見:[[開發文件/技術文檔/SAKURA API>開發文件/技術文檔/SAKURA API]]

*Direct SSTP [#e8ba6617]
Direct SSTP是一種利用窗口消息(非socket)進行SSTP協議通信的辦法。 Direct SSTP具有以下優點:~

可以使用SSTP進行簡單快速地通信(對於成本)。~
在本地計算機上兩個或更多的服務器很容易共存。 (人格彼此之間的通信很容易。)~
Direct SSTP只是一個通信方法,與協議本身無關。~
&color(#ff0000){注意: Direct SSTP的執行依賴於微軟Windows。};~
Direct SSTP使用wm_copydata傳輸數據請求到服務器使用以下協議。 Direct SSTP服務器處理請求並返回相同格式的應答給報頭中指定的HWND窗口句柄。~

 copydatastruct
 dwData = 9801
 cbData = 請求報頭的長度
 lpData = 請求報頭字符串的指針

請求報頭如

 SEND SSTP/1.4
 Sender: CardCaptor
 Script: \h\s0Ah... Oh... Hmm...\e
 HWnd: 1024
 Charset: Shift_JIS
    
請求報頭的規格是與SSTP相同的。然而,應注意的是不管什麼樣的請求HWND報頭必須包含。不包含HWnd的Direct SSTP通信請求會被認為是一個“錯誤的請求”。

*SSTP [#l05c40cb]
''SSTP協議基本結構''~
''概念''~
所有的"SAKURA"都能作為SSTP的服務器。一個SSTP的服務器通過使用SSTP的固定協議和一個SSTP的客戶端通信,並按要求進行各種操作。有了這個結構,我們可以預期以下的"SAKURA":~

使用一個“表達對象”。~

給予“偽AI”適當的資料實現更好的潛力。~

由於這項服務是不依賴於操作系統的,所以可能並不終止於本地機器。~
例如:~
從SSTP客戶端"SAKURA"通過互聯網發送SSTP數據包給獨立的計算機。~
從網絡服務器發送SSTP數據包到"SAKURA"客戶機。~

''操作''~
"SAKURA"會偵聽9801端口(和/或端口7743)。客戶端連接到這個端口,並使用SSTP協議發送數據包。當客戶端發送數據包,"SAKURA"在兩秒鐘內返回一個狀態碼。如果包是正確的,"SAKURA"回應包中的請求並執行相應的操作。~
一台服務器只可以連接到一個客戶端。如果服務器已經連接到另一個客戶端,服務器會返回一個衝突。
通信假定會在很短的時間內完成。因此,如果在很短的時間內不能結束溝通,服務器將返回一個超時並強制斷開連接。~

''SSTP的協議定義''~
''字符集''~
請求主體和基本報頭(非DBCS,只有單字節字符在報頭)只使用ASCII碼。~
報頭中需要使用多字節字符的字符串(Sender/Script/Document/Songname/Sentence等)(發件人/腳本/文件/歌名/句子)可以使用下面的字符集和編碼:
 ASCII
 Shift_JIS
 ISO-2022-JP
 EUC-JP
 UTF-8

該字符集設置必須定義。如果字符集沒有定義,默認為Shift_JIS,但不建議使用。~
例如:

 SEND SSTP/1.1
 Sender: カードキャプター
 Script: \0\s0汝のあるべき姿に戻れ。 \e
 Option: nodescript,notranslate
 Charset: UTF-8
 
 [EOD]

在這個例子中,發件人和腳本頭被定義為使用UTF-8編碼。~

''請求''~
詳見:[[開發文件/技術文檔/SSTP>開發文件/技術文檔/SSTP]]

''返回狀態碼''~
|>|~2xx - 過程完成|
|200|OK 正常結束|
|204|無內容正常結束,但沒有數據被返回|
|210|中斷 SSTP發生中斷|
|>|~4xx - 請求錯誤|
|400|錯誤的請求 無效的請求內容|
|408|請求超時 發送數據時發生超時|
|409|衝突另一個客戶端已經連接,或關鍵會話正在運行|
|420|拒絕 人格拒絕SSTP|
|>|~5xx - 服務器錯誤|
|501|未實現服務器不支持所請求的功能。|
|503|服務不可用服務器設置不接受已發送請求。|
|510|非本地IP 服務器設置為只接受本地IP請求。|
|511|在黑名單中請求的服務器在服務器黑名單中登入。|
|512|無法顯示服務器在無法顯示信息的狀態。 (即使發送請求也是沒有用的。)|

''Reguration''~
通信時限為服務器端計時2秒。如果請求無法在2秒鐘下完成,服務器將返回“請求超時”,並強制斷開連接。

首頁   新建條目 一覽 搜索 最近的變更   幫助   最近更新的RSS