2012-08-01 8 views
10

अद्यतन: प्रोटोकॉल here के माध्यम से देखकर, मैं यह नहीं समझ सकता कि अनसुलझा लिफाफा रिकॉर्ड में क्या होता है। मुझे ऑनलाइन कोई उदाहरण नहीं मिल रहा है।मैं नामित पाइप का उपयोग कर सी ++ से डब्ल्यूसीएफ विधि कैसे कॉल करूं?

मूल:

मैं निम्नलिखित WCF सेवा

static void Main(string[] args) 
    { 
     var inst = new PlusFiver(); 
     using (ServiceHost host = new ServiceHost(inst, 
      new Uri[] { new Uri("net.pipe://localhost") })) 
     { 
      host.AddServiceEndpoint(typeof(IPlusFive), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "PipePlusFive"); 
      host.Open(); 
      Console.WriteLine("Service is Available. Press enter to exit."); 
      Console.ReadLine(); 
      host.Close(); 
     } 
    } 

    [ServiceContract] 
    public interface IPlusFive 
    { 
     [OperationContract] 
     int PlusFive(int value); 
    } 


    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    public class PlusFiver : IPlusFive 
    { 
     public int PlusFive(int value) 
     { 
      Console.WriteLine("Adding 5 to " + value); 
      return value + 5; 
     }  
    } 

मैं उत्पादन जोड़ने 5 लाइन तो मैं जानता हूँ कि अगर सर्वर अनुरोध संसाधित किया हो या न हो।

मेरे पास एक .NET क्लाइंट है जिसका मैं परीक्षण करता था और सबकुछ के रूप में काम करता है।

अब मैं इसके लिए एक अप्रबंधित सी ++ क्लाइंट बनाना चाहता हूं।

मुझे पता चला कि पाइप का नाम कैसे प्राप्त करें, और इसे लिखें।
मैंने here

से प्रोटोकॉल डाउनलोड किया है, मैं पाइप को लिख सकता हूं लेकिन मैं इसे पढ़ नहीं सकता। जब भी मैं इसे पढ़ने की कोशिश करता हूं मुझे ERROR_BROKEN_PIPE 109 (0x6D) The pipe has been ended. त्रुटि मिलती है। यदि मैं एक लेखन के साथ पढ़ने को प्रतिस्थापित करता हूं, तो लेखन सफल होता है, इसलिए मुझे नहीं लगता कि पाइप बंद है, कम से कम तब तक जब तक मैं पढ़ने की कोशिश नहीं करता।

यहां बताया गया है कि मैं पाइप से कैसे जुड़ रहा हूं।

HANDLE OpenPipe(OLECHAR* bstrGuid) 
{ 
    wstring pipeName = L"\\\\.\\pipe\\"; 
    wstring strGuid = bstrGuid; 
    pipeName.append(strGuid.substr(1,36)); 
    wcout << "Pipe Name " << endl; 
    wcout << pipeName.c_str() << endl; 

    HANDLE hPipe = CreateFile(pipeName.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); 
    if(hPipe == INVALID_HANDLE_VALUE) 
    { 
     wcout << "failed to create pipe" << endl; 
     system("pause"); 
     return NULL; 
    } 
    return hPipe; 
} 

यह कैसे मैं पहला संदेश है कि मैं

std::list<wchar_t> GetFirstMessage() 
{ 
    std::list<wchar_t> message; 
    message.push_back(0x00);// version record 
    message.push_back(0x01);// major version 
    message.push_back(0x00);// minor version 
    message.push_back(0x01);// mode record 
    message.push_back(0x01);// singleton-unsized mode 
    message.push_back(0x02);// via record 

    wstring url = L"net.pipe://localhost/PipePlusFive"; 
    message.push_back(url.length());// via length 
    for(int x= 0;x<url.length();x++) 
    { 
     message.push_back(url[x]); // via 
    } 
    message.push_back(0x03); 
    message.push_back(0x08); 
    return message; 
} 

भेज रहा यह वह जगह है मैं इसे कैसे फाइल करने के लिए लिख रहा हूँ बना रहा हूं है।

int WriteMessage(HANDLE hPipe, LPVOID message, int size) 
{ 
    DWORD bytesWritten; 

    BOOL bWrite = WriteFile(hPipe, &message, size, &bytesWritten, NULL); 
    wcout << "Bytes Written: " << bytesWritten << endl; 
    if(bWrite == false) 
    { 
     wcout << "fail"<<endl; 
     CloseHandle(hPipe); 
     system("pause"); 
     return 1; 
    } 
    return 0; 
} 

    list<wchar_t> full_message = GetFirstMessage(); 
int result = WriteMessage(hPipe, &full_message, full_message.size()); 
if (result == 1) 
{ return 1;} 

यहाँ कैसे मैं अंत संदेश

wchar_t message = 12; 
result = WriteMessage(hPipe, &message, 1); 
if (result == 1) 
{ return 1;} 
यहाँ

लिख रहा हूँ है कि कैसे मैं प्रतिक्रिया

char buffer[10]; 
DWORD bytesRead; 
BOOL bRead = ReadFile(hPipe, buffer, 1, &bytesRead, NULL); 
if(bRead == false) 
{ 
    wcout << "fail read"<<endl; 
    wcout << "error: " << GetLastError() << endl; 
    CloseHandle(hPipe); 
    system("pause"); 
    return 1; 
} 

मैं ग के लिए नया हूँ पढ़ने के लिए कोशिश कर रहा हूँ ++, इसलिए मुझे नहीं पता कि मैं प्रोटोकॉल का सही ढंग से पालन नहीं कर रहा हूं या जिस तरह से मैं ऐसा करने की कोशिश कर रहा हूं उसमें एक बेवकूफ गलती कर रहा हूं?

अद्यतन: समस्या यह थी कि मैं सूची की सामग्री के बजाय नामित पाइप पर सूचक पता लिख ​​रहा था। मैंने इसे ठीक कर दिया है और अब मैं प्रमोबल एक रिकॉर्ड पढ़ने में सक्षम हूं। अब मुझे यह पता लगाना होगा कि प्रोटोकॉल के अगले भाग के लिए क्या भेजा जाना चाहिए।

+0

क्या आप प्रबंधित सी ++ या किसी अन्य आसान डब्ल्यूसीएफ बाध्यकारी (आरईएसटी, आदि) का उपयोग नहीं कर सकते? –

+0

मैं प्रबंधित सी ++ का उपयोग नहीं कर सकता। मुझे लगता है कि आरईएसटी धीमा होगा। – scott

+0

यहां एक समाधान है: http://stackoverflow.com/questions/686452/create-wcf-service-for-unmanaged-c-clients लेकिन यह प्रबंधित सी ++ –

उत्तर

0

चेक अगर यह आप

  1. कोशिश एक नामित पाइप खोलने के लिए के लिए काम करता है। (CreateFile)
  2. निर्दिष्ट नामित पाइप के पढ़ने मोड और अवरुद्ध मोड को सेट करें। (SetNamedPipeHandleState)
  3. पाइप सर्वर पर एक संदेश भेजें और इसकी प्रतिक्रिया प्राप्त करें। (WriteFile, ReadFile)
  4. पाइप बंद करें।(CloseHandle)
संबंधित मुद्दे