• C++ Socket学习记录 -3


    WinSocket套接字之间的数据传输

    在客户端和服务端建立链接后,接着就是在套接字之间传输数据。

    很简单的使用 recv 接收数据,用send发送数据,单但是出现一个问题,不管接收还是发送,数据都是以 char* 形式储存在缓存区的,如果有一个CString 对象,那么该怎么办呢?

    很自然的就想到了把 CString 转换为 char* :

    CString cstr = "Hello Client!";

    char * chr = (LPSTR)cstr.GetBuffer();

    ::send(Skt, chr, 512, 0);

    然后在客户端接收一看结果,呵呵…………

    只接收到一个“H”,其他的数据呢??????!

    起初以为是数据长度为问题,然后修改各种长度数值,结果仍然是一样……

    然后怀疑是转换过程出现了问题?于是上网上找,也尝试了N中转换方法,结果都是一样……当时已经疯了!!

    折腾了两个小时啊~

    后来,觉得是不是这样的,因为char*是指针,它实际上指向的是字符串首字符的地址,那么在直接传输的时候,也只是将首字符传过去了?不知道对不对,看样子实际情况是这样的。这不坑爹么!!

    那就要想办法吧整个串发送过去,而不是首字符。但是send函数要求参数为char*,而char*指向的就是首字符,好像又绕回来了……

    想来想去,试试string吧,因为在实质上string就是char[],也可以理解为char*.

    至于怎么把CString转换为string ,网上也有不少的方法,都是来回倒腾,这里也提供一种个人觉得用起来比较舒服的一种

    CString cstr = _T("CString对象");

    string str =(_bstr_t)cstr;

    OK,搞定。

    不过因为在send的时候,还是需要char*对象,所以,在传参时候仍需转换一下

    ::send(Skt, buffer.c_str(), 512, 0);

    哈,居然成功了!晕了~

    既然用  (_bstr_t)cstr 转换为string可以,那干嘛中间还倒腾一回呢,直接

    ::send(Skt, (_bstr_t)cstr, 512, 0);

    但是,但是,但是……中文乱码了!!!!!!!

    再试试用string呢,好吧,I 服了 YOU,这么写 ::send(Skt, buffer.c_str(), 512, 0); 居然是可的。

    不管怎么说,这个灵光一闪的问题,终究是解决了……

    总结起来,也就三行代码(-_-|||)

        CString cstrHello = _T("This is Service Msg,来自服务器的消息! ");
        string buffer = (_bstr_t)cstrHello;
        ::send(Skt, buffer.c_str(), 512, 0);

    不能说C++难,只能说自己学的不到位……

  • 相关阅读:
    linux 服务发布脚本升级,远程发布,指定拉取远程dev,test等分支代码
    linux 执行脚本1.补充命令 2.后台执行
    centos7 操作防火墙
    复制目录及其子目录下所有文件DOC
    总结
    nmon监控与 nmon analyser分析
    nginx配置文服
    单字段去重 distinct 返回其他多个字段
    二维数组怎样进行遍历
    Socket与URL通信比较
  • 原文地址:https://www.cnblogs.com/xtblog/p/5814205.html
Copyright © 2020-2023  润新知