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. Java多线程中join方法详解

    join()方法用于让当前执行线程等待join线程执行结束.其实现原理是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待. join()方法部分实现细节 while(isAli ...

  2. Educational Codeforces Round 21 A-E题题解

    A题      ............太水就不说了,贴下代码 #include<string> #include<iostream> #include<cstring& ...

  3. Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构

    1) 不可视的background页面 Google Chrome扩展往往包含一个不可见的background页面,Google Chrome扩展的主要业务逻辑都位于此.有两种类型的backgroun ...

  4. java 线程 理解 解析

    1 线程的概述 进程:正在运行的程序,负责了这个程序的内存分配,代表了内存中的执行区域. 线程:就是在一个进程中负者一个执行路径. 多线程:就是在一个进程中多个执行路径同时执行. 假象: 电脑上的程序 ...

  5. Spring Boot 系列(四)静态资源处理

    在web开发中,静态资源的访问是必不可少的,如:图片.js.css 等资源的访问. spring Boot 对静态资源访问提供了很好的支持,基本使用默认配置就能满足开发需求. 一.默认静态资源映射 S ...

  6. MongoDB数据库基础操作

    前面的话 为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为Mongodb是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储 ...

  7. tcp入门(唐唐的故事)

    1,互联网的实现,分成好几层.每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持.把互联网分成五层,容易让人理解. 2,对这五层的理解(唐唐讲故事): 实体层:目的就是把计算机连接起来,用电气 ...

  8. 20170709_python_学习记录

    a='ABC';变量赋值时发生了什么 1.在内存中创建一个字符串'ABC' 2.在内存中创建一个变量a指向字符串'ABC' list [] 相当于数组 指向可以变动 str[1,2,3,4] str. ...

  9. 认识cpu、核与线程

    作为一个后台开发人员,我想有必要了解这些基础知识.如果本文有不严谨或者疏忽的地方,请指正. cpu与核心 物理核 物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数 虚拟核 所谓的4核 ...

  10. BI服务器配置与客户端情况

    1. BI描述 FineBI是一款纯B/S端的商业智能分析服务平台:支持通过web应用服务器将其部署在服务器上,提供企业云服务器.用户端只需要使用一个浏览器即可进行服务平台的访问和使用.因此在配置使用 ...