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,来自服务器的消息!\r\n");
    string buffer = (_bstr_t)cstrHello;
    ::send(Skt, buffer.c_str(), 512, 0);

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

C++ Socket学习记录 -3的更多相关文章

  1. C++ Socket学习记录 -2

    WinSock TCP 编程流程 TCP通信,就像是固定电话,首先是要安装基站,然后是将电话号绑定到电话,然后拨号,接通之后说事,完事之后还要挂电话(甭管谁先挂). 1.初始化环境 使用函数 int ...

  2. C++ Socket学习记录 -1

    1.IP的转换 1)正转换 结构 sockaddr_in 在C++ 中表明一个IP地址结构,包含地址家,端口以及IP地址等信息 如: sockaddr_in addr; addr.sin_family ...

  3. [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …

    [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Pyth ...

  4. zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP

    阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库  http://download.zeromq.org ...

  5. Java 8 学习记录

    Java 8 学习记录 官方文档 https://docs.oracle.com/javase/8/ https://docs.oracle.com/javase/8/docs/index.html ...

  6. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  7. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  8. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  9. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

随机推荐

  1. 1.0 配置 appium + java的环境

    1. 配置 appim的环境前面中写到.       2. 在eclipse中配置 java 环境, 具体步骤:       <1>:在 eclipse 中新建 一个java 项目.   ...

  2. JavaScript一个拖动元素的实例

    <script type="text/javascript" src="./whenReady.js"></script> <bo ...

  3. 【干货】JS相关知识点总结

    一.获取元素方法 可以使用内置对象document上的getElementById方法来获取页面上设置了id属性的元素,获取到的是一个html对象,然后将它赋值给一个变量.如下: 上面的语句,如果把j ...

  4. 每天来点Java面试题(一)

    (1)java 中的 static  字段的 使用: 什么是 static ? 它是 java 的修饰符,定义静态变量和静态方法. 什么时候用? 通常用在工具类里面,修饰静态方法,然后供其它类的方法使 ...

  5. Memcached的安装与使用

    这一段折腾了下Memcached,有所收获吧,记录一下. 1.什么是Memcached memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memca ...

  6. Python运维开发基础-概述-简介

    Python基础知识分为以下几块 1.Python概述 2.基础语法 3.数据结构 4.Python进阶 5.实训案例 一.Python概述 1.Python简介 2.Hello World 3.搭建 ...

  7. Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动

    Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动 >>>>>>>>>>>>>> ...

  8. Ubuntu16.04修改内核启动

    写这篇文章一是为了对遇到同样问题的人提供一个参考,二来也是为了自己便于总结和查阅.希望大神勿喷. 好了,废话不多说了,转入正题. 前几天给自己的电脑装了个Ubuntu16.04LTS,自己顺手就把里边 ...

  9. python全栈阶段测试(一)

    1.执行Python脚本的两种方式 如果想要永久保存代码,就要用文件的方式 如果想要调试代码,就要用交互式的方式 2.Pyhton单行注释和多行注释分别用什么? 单行注释:# 多行注释: '' &qu ...

  10. join和wait

    最近看多线程的时候发现对于join的理解有些错误,在网上查了不少资料,根据自己的理解整理了一下,这里之所以把join和wait放在一起,是因为join的底层实现就是基于wait的,一并讲解更容易理解. ...