2021年7月

“欲速则不达,见小利则大事不成。”

protobuf 交叉编译 for arm

github 地址:https://github.com/protocolbuffers/protobuf

下载最新版3.17.3

wget https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.17.3.zip
mv v3.17.3.zip protobuf-v3.17.3.zip
unzip protobuf-v3.17.3.zip
cd protobuf-3.17.3/
./autogen.sh 
CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ ./configure --prefix=$(pwd)/install --host=arm-linux

会提示没有googletest,可以不用理他。

make && make install

受不了太慢

make -j8 && make install

cd install/lib
tree

.
├── libprotobuf.a
├── libprotobuf.la
├── libprotobuf-lite.a
├── libprotobuf-lite.la
├── libprotobuf-lite.so -> libprotobuf-lite.so.28.0.3
├── libprotobuf-lite.so.28 -> libprotobuf-lite.so.28.0.3
├── libprotobuf-lite.so.28.0.3
├── libprotobuf.so -> libprotobuf.so.28.0.3
├── libprotobuf.so.28 -> libprotobuf.so.28.0.3
├── libprotobuf.so.28.0.3
├── libprotoc.a
├── libprotoc.la
├── libprotoc.so -> libprotoc.so.28.0.3
├── libprotoc.so.28 -> libprotoc.so.28.0.3
├── libprotoc.so.28.0.3
└── pkgconfig

├── protobuf-lite.pc
└── protobuf.pc

1 directory, 17 files

file libprotobuf.so.28.0.3 

libprotobuf.so.28.0.3: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=3dc132b70a58e7012b755b18f076ff625359ef59, with debug_info, not stripped

编译好的头文件与lib文件下载包
protobuf-3.17.3-arm.tar.xz

八云酱 Github 下载链接:https://github.com/bayunjiang/typecho-sitemap

git clone https://github.com/bayunjiang/typecho-sitemap

Cloning into 'typecho-sitemap'...
remote: Enumerating objects: 67, done.
remote: Total 67 (delta 0), reused 0 (delta 0), pack-reused 67
Unpacking objects: 100% (67/67), 222.93 KiB | 419.00 KiB/s, done.

登陆 Typecho 后台,在插件管理处,启用相应插件即可。

sitemap 的访问路径即是一般认为的 https://const.net.cn/sitemap.xml

然后可以将站点地图链接放到index.php中。spider就能够抓取到了。

中国监管层要求滴滴出行从美国退市 因担心数据安全问题--彭博新闻 | 路透 update:2021-11-26
据彭博新闻周五报导,中国监管机构已要求叫车巨头滴滴出行DIDI.N的高管制定一个从美国证交所退市的计划,因为担心数据安全问题。

彭博引述知情人士报导称,中国监管机构希望滴滴管理层将该公司从纽约证交所退市,原因是担心敏感数据泄露。负责中国数据安全的中国网信办已指示滴滴制定相关细则。

滴滴出行和中国网信办没有回应路透的评论请求。

据彭博报导,正在考虑的提议包括直接私有化或在香港上市,之后再从美国退市。

报导引述消息人士的话称,如果进行私有化,要约报价将至少齐平于14美元的IPO价格,因为在6月首次公开发行后这么快就提出更低的报价可能会引发诉讼或股东抵制。

持有滴滴少数股权的日本软银集团9984.T,股价下挫逾5%。

消息人士曾经告诉路透,滴滴在6月推进其在纽约上市时惹怒了中国当局,监管机构曾敦促该公司在对其数据做法进行网络安全审查时暂停上市。

不久之后,中国网信办对滴滴收集和使用个人数据的行为发起调查。网信办称其非法收集数据,并要求应用程序商店删除滴滴运营的25个移动应用程序。

滴滴当时回应说,它已停止注册新用户,并将作出改变以符合国家安全和个人数据保护的规定,并将保护用户的权利。

Referenced from:https://cn.reuters.com/article/china-regulator-didi-delist-1126-idCNKBS2IB096?il=0

滴滴正在考虑私有化,以安抚中国当局,并补偿投资者自该公司在美国上市以来的损失。

该报引述知情人士报导称,随着监管打击扩大,滴滴出行一直在考虑退市计划,并已获得网络安全监管当局的支持。

滴滴发生这种转变距离其在纽约证券交易所(NYSE)上市仅仅一个月。滴滴在纽交所上市几天后,中国网络监管机构即对滴滴启动网络安全审查,审查期间停止新用户注册。

监管机构还要求要求应用商店下架滴滴出行APP。

报导还指出,滴滴一直在与银行家、监管机构和关键投资者进行谈判,探讨如何解决滴滴在纽约证交所上市后出现的问题。

报导称,滴滴已要求主承销商评估投资者对私有化计划的看法,以及他们能接受的定价范围。

Referenced from:https://cn.reuters.com/article/didi-privatization-rumor-probe-0729-idCNKBS2EZ1GN?il=0

据知情人士透露,中国网约车巨头滴滴(Didi Global Inc.,
DIDI)正考虑私有化,以平息中国监管部门的不满,并补偿投资者在该公司6月底在美国上市以来遭受的损失。

上述知情人士表示,总部位于北京的滴滴已经在与银行业人士、监管部门和主要投资者讨论如何解决该公司6月30日在纽约证券交易所上市后出现的一些问题。这些人士还称,正在考虑的初步选择之一是私有化,涉及对该公司公开交易的股票提出一项收购要约。

Referenced from:https://cn.wsj.com/articles/%25E6%25BB%25B4%25E6%25BB%25B4%25E8%2580%2583%25E8%2599%2591%25E7%25A7%2581%25E6%259C%2589%25E5%258C%2596%25E4%25BB%25A5%25E5%25AE%2589%25E6%258A%259A%25E4%25B8%25AD%25E5%259B%25BD%25E7%259B%2591%25E7%25AE%25A1%25E9%2583%25A8%25E9%2597%25A8%25E5%25B9%25B6%25E8%25A1%25A5%25E5%2581%25BF%25E6%258A%2595%25E8%25B5%2584%25E8%2580%2585-11627562409

7月29日晚,针对外媒报道称滴滴正在考虑私有化退市一事,滴滴回应称,有关私有化的传闻为不实信息,目前公司正积极全面配合网络安全审查。

有媒体报道指中国网约车巨头滴滴正在考虑私有化,但滴滴对此否认称,相关传闻为不实信息,目前公司正积极全面配合网络安全审查。

据路透社报道,滴滴出行昨天在官方微博发布了上述回应。滴滴美股昨天盘前涨幅收窄至10.3%,此前在出现公司将私有化的传闻后,滴滴股价涨幅一度高达50%。

Referenced from:https://www.zaobao.com/finance/china/story20210730-1175512

经常使用UDP发送数据,但一般都是小包,没有太关注过发送大包的问题。突然要发个大包,c++ udp send big packet。
就tcpdump wireshark抓包看了一下。
结果在tcpdump中,出现了这个东西。
UDP, bad length 5455 > 1472
看来UDP包长度超过MTU了。应该是分片了,但分片就分片,只要网络可靠,应该都没什么问题。

另外就是怕UDP的接收或者发送缓冲区不够了。

udp setsockopt sendbuf example

还有多网卡的问题。直接指定网卡,这个要用到struct ifreq.这是linux下的用法。
windows好像没有这个SO_BINDTODEVICE选项,不过可以使用静态路由的方式。可以参考这个链接:
多网卡指定网卡进行UDP通信(添加静态路由解决双网卡问题 )全记录
最后代码如下:

注意 struct ifreq 头文件如下: struct ifreq header file

#include <sys/ioctl.h>
#include <net/if.h>

int cudp::udp_send(string ip, int port, string data)
{
    printf("udp_send ip=%s,port=%d\n",ip.c_str(),port);
    int m_nsockfd;
    if ((m_nsockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
        printf("udp_send error.\n");
        return -1;
    }
    struct ifreq ifr;
    memset(&ifr, 0x00, sizeof(ifr));
    strncpy(ifr.ifr_name, "eth0", 4);
    setsockopt(m_nsockfd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&ifr, sizeof(ifr));

    int addrlen = sizeof(sockaddr_in);
    struct sockaddr_in addr;
    bzero(&addr, sizeof(struct sockaddr_in));    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = inet_addr(ip.c_str());
    int sendbuff;
    socklen_t optlen;
    int res = 0;

    // Get buffer size
    optlen = sizeof(sendbuff);
    res = getsockopt(m_nsockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);

    if(res == -1)
        printf("Error getsockopt one");
    else
        printf("send buffer size = %d\n", sendbuff);

    sendbuff = 50*1024;

    printf("sets the send buffer to %d\n", sendbuff);
    res = setsockopt(m_nsockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff));

    if(res == -1)
        printf("Error setsockopt");
        
    int ret = sendto(m_nsockfd, data.data(), data.length(), 0, (struct sockaddr *)&addr, addrlen);
    printf("sendto ret = %d\n", ret);
    return ret;
}

linux下可以直接拿来使用,用第一个示例就好了。

注意 struct ifreq 头文件如下: struct ifreq header file

#include <sys/ioctl.h>
#include <net/if.h>

这是代码的方法,肯定也有指定路由的办法。有兴趣的话可以了解一下。大致思路就是使用

route add ...
  1. example(TCP, UDP, RAW):

    int sock;
    struct ifreq ifr;
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    memset(&ifr, 0x00, sizeof(ifr));
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZE);
    setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&ifr, sizeof(ifr));
    
  2. example(PACKET):

    int sock;
    struct sockaddr_ll sl;
    struct ifreq ifr;
    sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6));
    memset(&sl, 0x00, sizeof(sl));
    memset(&ifr, 0x00, sizeof(ifr));
    sl.sll_family = AF_PACKET;
    sl.sll_protocol = htons(ETH_P_IPV6);
    strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
    ioctl(fd, SIOCGIFINDEX, &ifr);
    sl.sll_ifindex = ifr.ifr_ifindex;
    bind(fd, (struct sockaddr *)&sl, sizeof(sl));
    
  3. example(PACKET):

    int sock;
    struct sockaddr addr;
    sock = socket(PF_PACKET, SOCK_PACKET, ETH_P_IP);
    memset(&addr, 0x00, sizeof(addr));
    addr.sa_family = PF_PACKET;
    strncpy(addr.sa_data, "eth0", sizeof(addr.sa_data));
    bind(sock, &addr, sizeof(addr));
    

SO_BINDTODEVICE套接口选项说明:
SO_BINDTODEVICE
Bind  this  socket  to  a particular device like “eth0”, as specified in the passed interface name.  If the name is an empty string or the option length is zero, the socket device binding  is  removed.   The  passed option  is a variable-length null-terminated interface name string with the maximum size of IFNAMSIZ.  If a socket is bound to an interface, only packets received from that particular interface are processed by  the socket.  Note  that  this  only works for some socket types, particularly AF_INET sockets.  It is not supported for packet sockets (use normal bind(8) there).
Referenced from:https://blog.csdn.net/networkangle/article/details/52549758?tdsourcetag=s_pcqq_aiomsg