C++ Socket学习记录 -3
Posted 小白T哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,来自服务器的消息!\r\n");
string buffer = (_bstr_t)cstrHello;
::send(Skt, buffer.c_str(), 512, 0);
不能说C++难,只能说自己学的不到位……
以上是关于C++ Socket学习记录 -3的主要内容,如果未能解决你的问题,请参考以下文章
Socket基本操作的C++封装--以及Socket通信实践