区块链学习笔记P2P篇之二:公共头文件定义

搞了台阿里云做内网打洞测试,宏开关ALITEST用来内外网测试转换
#define SERVERIP “xx.xx.xx.xx” 是外网测试机的外网IP

//p2pServer.hpp

#ifndef __P2PSERVER_H
#define __P2PSERVER_H

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

#define ALITEST 1

#if ALITEST
#define SERVERIP    "xx.xx.xx.xx" 
#define LOCALPORT   10000
//#define IF_NAME "eth0"
#else //1
#define SERVERIP    "192.168.180.130"
#define LOCALPORT   20000
//#define IF_NAME "ens33"
#endif //1

#define SERVERPORT  9527

typedef enum
{
    cmd_register = 0,
    cmd_unregister,
    cmd_getnode,
    cmd_max
} Command;

typedef struct st_node
{
    int count;
    char queryIp[16];
    int queryPort;
    char recvIp[16];
    int recvPort;

    bool operator == (const struct st_node & value) const
    {
        return
            this->count == value.count &&
            this->queryPort == value.queryPort &&
            this->recvPort == value.recvPort &&
            !strcmp(this->queryIp, value.queryIp) &&
            !strcmp(this->recvIp, value.recvIp);
    }
} Node;

typedef struct st_nodeinfo
{
    Command cmd;
    Node node;
} NodeInfo;

static inline int get_local_ip(char * ifname, char * ip)
{
    char *temp = NULL;
    int inet_sock;
    struct ifreq ifr;

    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);

    memset(ifr.ifr_name, 0, sizeof(ifr.ifr_name));
    memcpy(ifr.ifr_name, ifname, strlen(ifname));

    if (0 != ioctl(inet_sock, SIOCGIFADDR, &ifr))
    {
        perror("ioctl error");
        return -1;
    }

    temp = inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr);
    memcpy(ip, temp, strlen(temp));

    close(inet_sock);

    return 0;
}

#endif // __P2PSERVER_H

猜你喜欢

转载自blog.csdn.net/mumufan05/article/details/82014317