Sloppy's Blog


  • Home

  • About

  • Archives
Sloppy's Blog

Asio使用小实例

Posted on 2016-06-08

写了个小型的ASIO TcpSocket测试小实例,分两部分,客户端C++,服务端模拟是Python

C++ 代码如下:

std::thread t([=]() {
    asio::io_service io_service;
    asio::ip::tcp::endpoint end_point(asio::ip::address::from_string("10.10.10.111"), 8088);
    asio::ip::tcp::socket socket(io_service);
    asio::error_code ec;
    socket.connect(end_point, ec);
    if (ec) {
        CCLOG("error");
        socket.close();
    }
    else {
        CCLOG("Success");
        char buf[100];
        size_t len = socket.read_some(asio::buffer(buf), ec);// 读取数据
        if (len > 0) {
            std::string value(buf, len);
            CCLOG("value:%s", value.c_str());
            std::cout.write(buf, len);
            socket.write_some(asio::buffer("123456"), ec);// 发送数据
        }

    }
});
t.detach();

服务端Python代码:

def initSock():
    sock = socket(AF_INET,SOCK_STREAM)
    ADDR=("10.10.10.111", 8088)
    sock.bind(ADDR)
    sock.listen(5)
    while True:
        print "waiting for connectiong"
        tcpClient,addr = sock.accept()
        print ('connect from',addr)
        s  = 'Hello world %s' %(ctime())
        tcpClient.send(s.encode("utf-8"))
        while True:
            try:
                data = tcpClient.recv(1024)
            except:
                print("exception")
                tcpClient.close()
                break
            if not data:
                print("invalid data")
                break;
            else:
                print data

    tcpClient.close()
    sock.close()
Sloppy's Blog

编译asio下的Android动态静态库

Posted on 2016-06-08

在Android开发时,省出每次都需要编译的麻烦,我们经常需要编译各种静态库与动态库,之前,开发通信时,我们用到asio,下面来编译一个库:

  • 建文件夹asio,再在该目录下建jni目录,把相关的代码Copy进来,并新建一个CPP文件,asio.cpp,内容如下:

    #include "asio.hpp"
    
  • jni目录下新建Android.mk文件,内容如下:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_ARM_MODE := arm
    LOCAL_MODULE := asio
    LOCAL_SRC_FILES := asio.cpp
    LOCAL_C_INCLUDES := $(LOCAL_PATH)
    \#include $(BUILD_SHARED_LIBRARY) \#这是动态库
    include $(BUILD_STATIC_LIBRARY)\#这是静态库
    
  • jni目录下新建Application.mk文件,内容:

    APP_STL := gnustl_static
    APP_OPTIM := release  
    APP_CFLAGS := -DASIO_STANDALONE=1 -fexceptions -DASIO_SEPARATE_COMPILATION -DASIO_HEADER_ONLY
    APP_CPPFLAGS := -frtti  -fexceptions -std=c++11 -fsigned-char
    APP_ABI = all
    
  • 打开命令行,切换到asio目录,运行NDK下的命令ndk-build,成功会生成libs目录

Sloppy's Blog

c++包装引用

Posted on 2016-06-08

在有些项目里,接口已经定义好,我们想修改已经存在的接口,是比较困难的,假如有如下的接口定义:

void handler(int &r) {
    r++;
}
template
void g(F f, P p) {
    f(p);
}

调用如下:

int i = 0;
handler(i); // 期望的结果
g(handler, i); 
// 打印i,看看结果,没有变化。不是期望的结果
// 在不改变接口的情况下,达到期望的结果
g(handler, std::ref(i));//期望的结果
Sloppy's Blog

C++禁止非期望类型调用

Posted on 2016-06-08

在有些需求的情况下,我们期望调用接口的方法,期望传入的类型必须是我想要的类型如何做呢?譬如有如下的类型定义

struct OnlyInt {
    void f(int i) {
        // code here
    }
};
OnlyInt oInt;
oInt.f(1);// 可以
oInt.f(1.0);// 也可以,那如何禁止这做非法呢?

下面我们来修改一下上面的类的定义

struct OnlyInt {
    void f(int i) {
    }
    template void f(T) = delete;// 禁止非整形调用
};
OnlyInt oInt;
oInt.f(1);// 可以
oInt.f(1.0);// 不可以,编译报错
Sloppy's Blog

Windows,android编译Asio

Posted on 2016-06-08

ASIO下载地址,接上篇xcode编译asio

android编译注意事项

Application.mk文件定义需要注意的是:

APP_STL := gnustl_static
APP_CFLAGS := -DASIO_STANDALONE=1 -DASIO_SEPARATE_COMPILATION -DASIO_HEADER_ONLY

这是我直接编译进项目的Class目录,如果你想自己编译成一个Module,可以自己编译独立的Android.mk文件。


Windows VS编译注意事项

Class目录下把ASIO源文件Copy进来,并在项目里添加跟ASIO的代码目录一样的过滤器即可

项目设置注意:项目属性—》c/c++ —->Preprocessor —> Preprocessor Definitions
添加三个Defnition:
ASIO_STANDALONE
ASIO_SEPARATE_COMPILATION
ASIO_HAS_STD_ATOMIC

Sloppy's Blog

Xcode集成asio

Posted on 2016-06-07

下载独立的Asio

下载ASIO

Xcode设置

  • c++ language 选择c++11以上
  • 选择libc++
  • 添加Macro:ASIO_STANDALONE和ASIO_SEPARATE_COMPILATION

编译部分

  • 把下载好的源码添加进Xcode
  • 添加测试代码
    // 添加头文件引用
    asio::io_service io_service;
    asio::ip::tcp::endpoint end_point(asio::ip::address::from_string("10.10.10.241"), 8088);
    asio::ip::tcp::socket socket(io_service);
    socket.connect(end_point);
    

参考

  • http://think-async.com/Asio/AsioStandalone
  • http://stackoverflow.com/questions/33544090/how-to-use-asio-standalone-in-xcode-c11-without-boost
Sloppy's Blog

GDB调试入门(1)

Posted on 2016-06-06

基于:MinGW,安装好之后,设置环境变量,在Path追加,(我是安装在:)D:\MinGW\bin

主程序代码:

// 头文件引用
int main(int argc,char *argv[])
{
std::cout << “hello, world” << std::endl;
int result = MediaUtils::add(10,3);
std::cout << result << std::endl;
return(0);
}

MediaUtls.h:

class MediaUtils
{
public:
static int add(int x,int y);
};

MediaUtls.cpp:

// 头文件引用
int MediaUtils::add(int x,int y){
int result = x+y;
return result;
}

编写makefile文件,内容如下:

###简单的编写配置,-g是需要添加,不会会提示找不到debug symbol 相关信息

HelloWorld: HelloWorld.o MediaUtils.o

g++ -g HelloWorld.o MediaUtils.o -o HelloWorld

HelloWorld.o:main.cpp

g++ -g -c main.cpp -o HelloWorld.o

MediaUtils.o:MediaUtils.cpp

g++ -g -c MediaUtils.cpp -o MediaUtils.o

在代码文件目录命令执行:mingw32-make

进入GDB,

命令行输入:gdb

file HelloWorld.exe //载入

list // 列出文件内容

run // 运行

break main.cpp:5 //打断点

用到的相关命令参考:

  1. list <显示源代码>
  2. break 行号 <设置断点>
  3. run <运行程序>
  4. continue <继续从断点处执行>
  5. print 变量 <调试时查看变量的值>
  6. del 行号 <删除断点>
  7. step <单步执行,可跟踪到函数内部>
  8. next <单步执行,不可跟踪到函数内部>
  9. quit <退出>
Sloppy's Blog

Windows下修改默认Emacs的配置文件路径

Posted on 2016-06-06

Windows默认的路径如下:

C:\Users\用户名\AppData\Roaming.emacs(如果没有该文件,可以用echo >.emacs产生一个)

可以修改其中的内容为:

(load-file “D:/Soft/emacs-bin-w64-20150818-07ebe42/config/.emacs”) ;;这是我自己的路径地址


Sloppy's Blog

Git的一些相关设置及操作命令

Posted on 2016-06-06

ssh-keygen -t rsa -C “caozhuhua@gmail.com”
ssh-add Github

Windows生成Git 密钥文件:

安装git,从程序目录打开 “Git Bash”
键入命令:ssh-keygen -t rsa -C “caozhuhua@gmail.com” “caozhuhua@gmail.com”是github账号
提醒你输入key的名称,输入如id_rsa
在C:\Documents and Settings\Administrator\下产生两个文件:id_rsa和id_rsa.pub
把4中生成的密钥文件复制到C:\Documents and Settings\Administrator.ssh\ 目 录下。
用记事本打开idrsa.pub文件,复制内容,在github.com的网站上到ssh密钥管理页面,添加新公钥,随便取个名字,内容粘贴刚才复制的内容。
^
^ OK了
需要注意步骤2中产生的密钥文件在当前用户的根目录,必须把这两个文件放到当前用户目录的“.ssh”目录下才能生效。
在windows中只能在命令行下输入创建”.”开头的文件夹。命令为 mkdir .ssh

使用Git:

添加文件
git add test.txt

提交:
git commit -m “注释”

上传
git push

取回本地(1):
git pull (会自动Merge)或者git pull origin master

取回本地(2) (不会自动Merge)
git fetch origin master
git log -p master..origin/master
git merge origin/master


Sloppy's Blog

#C++11 Lambda的一个坑

Posted on 2016-06-06

在类内如果书写这样的方法,在类析构时会产生坑:
有类成员 m_pVector;// 容器vector

void 类::test(){
 std::thread t(={ 
    std::this_thread::sleep_for(std::chrono::milliseconds(2000)); 
        m_pVector.clear();// crash
    });
    t.detach(); 
} 

1…456
Sloppy

Sloppy

54 posts
7 tags
© 2017 Sloppy
Powered by Hexo
Theme - NexT.Muse