导航

WP10通过StreamSocket连接C++服务器

Posted on 2015-05-08 21:11  ggzone  阅读(105)  评论(0编辑  收藏  举报

注:当服务端和手机模拟器运行在一台机器时,会有奇怪错误。将服务端放在其它机器上更改客户端连接地址,运行正常。或者直接用本机modern调试也可以。
实例化一个对象

StreamSocket _client = new StreamSocket();
Byte[] recvBuf= new Byte[8096];
Byte[] sendBuf= new Byte[8096];

建立连接:

async void connect()
{
    try
    {
        //设置服务器IP
        HostName serverHost = new HostName("127.0.0.1");
        //设置服务器端口号
        await _client.ConnectAsync(serverHost, 5000);  
    }
    catch (Exception e)
    {
        Debug.WriteLine(e);
        _client.Dispose();
        _client = null;
    }
}

接收和发送数据
由于Socket通信从本质上说是数据流的传输,即byte类型,StreamSocket使用DataReader类和DataWriter类来接收和发送数据流,两个类封装了不少实用的方法,但归根结底是对byte类型数据读取和发送的封装。
为了能够发送汉字,必须使用unicode编码。
C++发送数据:
为了能够发送汉字,必须将数据转换为wchar_t.

    wstring wstr = str_to_wstr(str);
    send(m_sock, (char*)wstr.c_str(), wstr.size()*2, 0);

C#接收数据:

    _reader = new DataReader(_client.InputStream);
    _reader.InputStreamOptions = InputStreamOptions.Partial;

    uint count = await _reader.LoadAsync(8096);
    _reader.ReadBytes(recvBuf);
    string msg = Encoding.Unicode.GetString(recvBuf);

C#发送数据:

    string strSend="xxxx";
    _writer = new DataWriter(_client.OutputStream);
    sendBuf= Encoding.Unicode.GetBytes(strSend);
    _writer.WriteBytes(sendBuf);
    await _writer.StoreAsync();
    _writer.DetachStream();
    _writer.Dispose(); 

C++接收数据:

    //按照以往方式接收数据,存放到char* buf中,然后转换
    wstring msg = dchar_to_wchar(buf);
    //转换函数可以这样写
    wstring dchar_to_wchar(char* source)
    {
        wchar_t* p =reinterpret_cast<wchar_t*>(source);
        return wstring(p);
    }

C#中断连接:

    clientSocket.Dispose();
    clientSocket = null;

此处有坑:
当使用async/await异步发送消息,然后再用async/await异步接收消息,虽然C++服务器返回了信息,但datareader.LoadAsync(int)会出各种错。主要是:datareader.LoadAsync(int)不返回,一直卡在那个这个函数等。
解决方法:
确认发送消息完成后再接收消息。