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)不返回,一直卡在那个这个函数等。
解决方法:
确认发送消息完成后再接收消息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,需要进行以下步骤: 1. 导入头文件 `#include <iostream>`, `#include <winsock2.h>`,并初始化 Winsock。 2. 创建一个套接字,使用SMTP协议连接到邮箱服务器。 3. 使用账号密码登录邮箱。 4. 选择收件箱,并获取邮件列表。 以下是C++代码示例: ```c++ #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") // 邮箱服务器地址和端口号 const char* smtp_server = "smtp.example.com"; const int smtp_port = 465; // 邮箱账号和密码 const char* username = "your_email@example.com"; const char* password = "your_password"; int main() { // 初始化 Winsock WSADATA wsaData; int ret = WSAStartup(MAKEWORD(2, 2), &wsaData); if (ret != 0) { std::cout << "WSAStartup failed: " << ret << std::endl; return 1; } // 创建套接字 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { std::cout << "socket failed: " << WSAGetLastError() << std::endl; WSACleanup(); return 1; } // 连接邮箱服务器 SOCKADDR_IN serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr(smtp_server); serverAddr.sin_port = htons(smtp_port); ret = connect(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)); if (ret == SOCKET_ERROR) { std::cout << "connect failed: " << WSAGetLastError() << std::endl; closesocket(sock); WSACleanup(); return 1; } // 登录邮箱 char buffer[1024]; memset(buffer, 0, sizeof(buffer)); recv(sock, buffer, sizeof(buffer), 0); std::cout << buffer; send(sock, "EHLO example.com\r\n", strlen("EHLO example.com\r\n"), 0); memset(buffer, 0, sizeof(buffer)); recv(sock, buffer, sizeof(buffer), 0); std::cout << buffer; send(sock, "AUTH LOGIN\r\n", strlen("AUTH LOGIN\r\n"), 0); memset(buffer, 0, sizeof(buffer)); recv(sock, buffer, sizeof(buffer), 0); std::cout << buffer; send(sock, username, strlen(username), 0); send(sock, "\r\n", strlen("\r\n"), 0); memset(buffer, 0, sizeof(buffer)); recv(sock, buffer, sizeof(buffer), 0); std::cout << buffer; send(sock, password, strlen(password), 0); send(sock, "\r\n", strlen("\r\n"), 0); memset(buffer, 0, sizeof(buffer)); recv(sock, buffer, sizeof(buffer), 0); std::cout << buffer; // 选择收件箱 send(sock, "SELECT INBOX\r\n", strlen("SELECT INBOX\r\n"), 0); memset(buffer, 0, sizeof(buffer)); recv(sock, buffer, sizeof(buffer), 0); std::cout << buffer; // 获取邮件列表 send(sock, "FETCH 1:* (BODY[HEADER.FIELDS (FROM TO SUBJECT DATE)])\r\n", strlen("FETCH 1:* (BODY[HEADER.FIELDS (FROM TO SUBJECT DATE)])\r\n"), 0); memset(buffer, 0, sizeof(buffer)); recv(sock, buffer, sizeof(buffer), 0); std::cout << buffer; // 关闭套接字,清理 Winsock closesocket(sock); WSACleanup(); return 0; } ``` 注意:以上代码只是一个示例,实际应用中需要根据具体的邮箱服务商和协议进行相应的修改和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值