2011-02-04 19 views
0

我寫的代碼攝取負責服務器的團隊所產生的IOR文件,並用它來我的客戶端綁定到它們的對象。聽起來很簡單,對吧?我如何解碼,更改,然後在我的Java客戶端代碼中重新編碼CORBA IOR文件(Visibroker)?

由於某種原因,有些東西超出了我的理解範圍(與防火牆,DMZ等有關),IOR文件中服務器的值並不是我們可以使用的。我們必須修改它。但是,IOR字符串被編碼。

Visibroker提供了什麼讓我可以解碼IOR字符串,更改一個或多個值,然後重新編碼它並繼續照常?

我已經看着IORInterceptors和URL命名,但我不認爲要麼會做的伎倆。

在此先感謝!

回答

-1

使用此功能可以改變IOR。傳遞字符串化的IOR作爲第一個參數。

void hackIOR(const char* str, char* newIOR) 
{ 
    size_t s = (str ? strlen(str) : 0); 
    char temp[1000]; 
    strcpy(newIOR,"IOR:"); 
    const char *p = str; 

    s = (s-4)/2; // how many octets are there in the string 
    p += 4; 

    int i; 

    for (i=0; i<(int)s; i++) { 

    int j = i*2; 
    char v=0; 

    if (p[j] >= '0' && p[j] <= '9') { 
     v = ((p[j] - '0') << 4); 
    } 
    else if (p[j] >= 'a' && p[j] <= 'f') { 
     v = ((p[j] - 'a' + 10) << 4); 
    } 
    else if (p[j] >= 'A' && p[j] <= 'F') { 
     v = ((p[j] - 'A' + 10) << 4); 
    } 
    else 
     cout <<"invalid octet"<<endl; 

    if (p[j+1] >= '0' && p[j+1] <= '9') { 
     v += (p[j+1] - '0'); 
    } 
    else if (p[j+1] >= 'a' && p[j+1] <= 'f') { 
     v += (p[j+1] - 'a' + 10); 
    } 
    else if (p[j+1] >= 'A' && p[j+1] <= 'F') { 
     v += (p[j+1] - 'A' + 10); 
    } 
    else 
     cout <<"invalid octet"<<endl; 
    temp[i]=v; 
    } 

    temp[i] = 0; 

    // Now temp has decoded IOR string. print it. 
    // Replace the object ID in temp. 
    // Encoded it back, with following code. 

    int temp1,temp2; 
    int l,k; 

    for(k = 0, l = 4 ; k < s ; k++) 
    { 

     temp1=temp2=temp[k]; 

     temp1 &= 0x0F; 

     temp2 = temp2 & 0xF0; 

     temp2 = temp2 >> 4; 

    if(temp2 >=0 && temp2 <=9) 
    { 
     newIOR[l++] = temp2+'0'; 
    } 
    else if(temp2 >=10 && temp2 <=15) 
    { 
     newIOR[l++] = temp2+'A'-10; 
    } 

    if(temp1 >=0 && temp1 <=9) 
    { 
     newIOR[l++] = temp1+'0'; 
    } 
    else if(temp1 >=10 && temp1 <=15) 
    { 
     newIOR[l++] = temp1+'A'-10; 
    } 
    } 

    newIOR[l] = 0; 

//new IOR is present in new variable newIOR. 

} 

希望這對你有用。

+0

此代碼將導致更多的問題,而不是它的價值。首先,它假定IOR的最大長度爲1,000字節,但IOR可以是任意長度。它也看起來像改變ObjectID,但問題是關於改變主機名。 C++中的IOR解碼器通常長達數百行,因爲它們必須處理所有可能的配置文件和標記的組件,但是這些代碼忽略了所有這些事情。它對IOR結構做出了一些非常奇怪的假設,我不會相信它,對不起。 「hackIOR」的確如此。 – 2011-10-09 23:11:20

2

當你覺得你需要破解一個IOR時,你可以通過編寫代碼來抵制這樣做的衝動,而不是爲了滿足你的喜好。 IOR意味着由包含被引用對象的服務器創建和口述,所以當你開始在那裏開始閒逛時,你有點「失去保修」。

相反,花時間尋找正確的方法,使IOR在您的環境中可用,方法是讓服務器在生成它們時使用替代主機名。大多數ORB提供這樣的功能。我不知道如果Visibroker的特殊配置選項在所有,但快速谷歌搜索發現this page顯示一個有前途的值:

vbroker.se.iiop_ts.host  
    Specifies the host name used by this server engine. 
    The default value, null, means use the host name from the system. 

希望有所幫助。

1

很久以前我爲GNU Classpath寫了IorParser,代碼可用。這是一個正常的解析器,意識到格式,不應該「失去保證」,我認爲。 IOR包含多個標記的配置文件,這些配置文件非常像XML一樣封裝,因此我們可以解析/修改我們需要並理解的配置文件,並保持其餘部分不變。

我們需要解析的配置文件是TAG_INTERNET_IOP。它包含版本號,主機,端口和對象密鑰。讀取和寫入該配置文件的代碼可以在gnu.IOR類中找到。我很抱歉,這是系統庫的一部分,並不是一個很好的代碼複製粘貼在這裏,但它應該不是很難用一些依賴類撕掉它。

這個問題已經被多次問爲CORBA :: Get the client ORB address and port with use of IIOP

0

使用從jacORB的FixIOR工具(二進制)來修補IOR的地址和端口。 Download the binary(解壓縮它),然後運行:

fixior <new-address> <new-port> <ior-file> 

該工具將覆蓋IOR文件與「修補」 IOR

的內容您可以使用IOR Parser來檢查所生成IOR並將其與原來的IOR