通过协议 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客户端,我曾经测试这一切,一切正常工作
预期.
现在我想为这个做一个非托管的C客户端.
我想出了如何得到管道的名称,并写信给它.
我从here下载了协议
我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_PIPE 109(0x6D)管道已经结束.错误.如果我用写入替换读取,则写入是成功的,所以我不认为管道是封闭的,至少直到我尝试读取.
这是我如何连接到管道.
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); 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,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;}
我是新来的c,所以我不知道我是不是正确地遵循协议,或者是以我这样做的方式犯了一个愚蠢的错误?
更新:
问题是我正在将命名地址写入命名管道而不是列表的内容.我已经解决了,我现在可以阅读前言Ack记录.现在我必须弄清楚下一部分协议需要发送什么.
>尝试打开命名管道. (的Createfile)>设置指定命名管道的读取模式和阻塞模式. (SetnamedPipeHandleState)>向管道服务器发送消息并接收其响应. (Writefile,Readfile)>关闭管道. (CloseHandle的)
总结以上是内存溢出为你收集整理的如何使用命名管道从c调用WCF方法?全部内容,希望文章能够帮你解决如何使用命名管道从c调用WCF方法?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)