• 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++难,只能说自己学的不到位……

  • 相关阅读:
    地址打开eclipse汉化全程
    可行性nullpoj 2723 Get Luffy Out 2sat
    服务器端提交Git版本控制tag标签的使用(二)
    原因总结六级之阅读理解
    子类父类浅谈filter里面为什么要强制转换成httpServletRequest类型
    排序中文POJ 1696/hrbustoj 1318 几何 蛋疼的蚂蚁
    选择复选框js限制checkbox勾选的个数以及php获取多个checkbbox的方法
    环境节点[置顶] 如何终止特定 RAC 实例上的 session
    整数实例hdu2041(超级楼梯)
    属性框架Fixjs——显示基类DisplayObject
  • 原文地址:https://www.cnblogs.com/xtblog/p/5814205.html
Copyright © 2020-2023  润新知