搞了台阿里云做内网打洞测试,宏开关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