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

注:当服务端和手机模拟器运行在一台机器时,会有奇怪错误。将服务端放在其它机器上更改客户端连接地址,运行正常。或者直接用本机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)不返回,一直卡在那个这个函数等。
解决方法:
确认发送消息完成后再接收消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值