#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#define CMD_JOIN 0x01 /*连接结点*/
#define CMD_DATA 0x02 /*传输数据*/
#define CMD_REDIRECT 0x03 /*连接转向*/
#define CMD_ERROR 0xFE /*错误(回应)*/
#define CMD_OK 0xFC /*正确(回应)*/
#define DEV_SEND 0x01 /*发射器*/
#define DEV_RECV 0x02 /*接收器*/
/*获取appid所在的服务器*/
int get_port(char svrip[], int svrport, char dev, char appid[], char *ip, int *port)
{
int sock_fd = 0;
int i = 0;
int recbytes =0;
char buf[1024] = {0};
struct sockaddr_in s_add, c_add;
sock_fd = socket ( AF_INET, SOCK_STREAM, 0 );
if ( -1 == sock_fd )
{
return -1;
}
bzero ( &s_add,sizeof ( struct sockaddr_in ) );
s_add.sin_family = AF_INET;
s_add.sin_addr.s_addr = inet_addr (svrip);
s_add.sin_port = htons ( svrport );
if ( -1 == connect ( sock_fd, ( struct sockaddr * ) ( &s_add ), sizeof ( struct sockaddr ) ) )
{
return -1;
}
/*构造包,申请连接appid*/
buf[0] = CMD_JOIN; /*命令字*/
buf[1] = dev; /*设备类型*/
strcpy(buf + 2, appid);
write(sock_fd, buf, 18);
if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
{
return -1;
}
buf[recbytes] = '\0';
/*服务器收到申请后,会找一台与客户端最近的连接机,并返回其ip与port*/
if(buf[0] == CMD_REDIRECT)
{
for (i = 0; i < recbytes - 1; i++)
{
if (buf[i+1] == '_')
{
ip[i] = '\0';
break;
}
else
{
ip[i] = buf[i+1];
}
}
*port = atoi(buf+2+i);
}
else
{
return -1;
}
return 0;
}
/*发送数据到appid上*/
int send_data(char svrip[], int svrport, char appid[])
{
int sock_fd = 0;
int i = 0;
int recbytes = 0;
char buf[1024] = {0};
struct sockaddr_in s_add, c_add;
sock_fd = socket ( AF_INET, SOCK_STREAM, 0 );
if ( -1 == sock_fd )
{
return -1;
}
bzero ( &s_add,sizeof ( struct sockaddr_in ) );
s_add.sin_family = AF_INET;
s_add.sin_addr.s_addr = inet_addr (svrip);
s_add.sin_port = htons ( svrport );
if ( -1 == connect ( sock_fd, ( struct sockaddr * ) ( &s_add ), sizeof ( struct sockaddr ) ) )
{
return -1;
}
/*构造包,申请连接appid*/
buf[0] = CMD_JOIN; /*命令字*/
buf[1] = DEV_SEND; /*发送型设备*/
strcpy(buf + 2, appid);
write(sock_fd, buf, 18);
if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
{
return -1;
}
/*收到加入appid包之后,服务器返回CMD_OK状态*/
if((unsigned char)buf[0] == CMD_OK)
{
while (1)
{
/*不断向服务器发送一个随机数*/
buf[0] = CMD_DATA;
sprintf(buf + 1, "%d\n", rand());
write(sock_fd, buf, strlen(buf));
if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
{
return -1;
}
if((unsigned char)buf[0] != CMD_OK)
{
return -1;
}
sleep(1);
}
}
return 0;
}
int main(int argc,char *argv[])
{
char *master_ip = argv[1]; /*服务器ip*/
int master_port = 5615; /*服务器port*/
char *appid = argv[2]; /*APPID*/
char slaver_ip[100] = {0};
int slaver_port = 0;
get_port(master_ip, master_port, DEV_SEND, appid, slaver_ip, &slaver_port);
printf("slaver: %s %d\r\n", slaver_ip, slaver_port);
send_data(slaver_ip, slaver_port, appid);
return 0;
}
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#define CMD_JOIN 0x01 /*连接结点*/
#define CMD_DATA 0x02 /*传输数据*/
#define CMD_REDIRECT 0x03 /*连接转向*/
#define CMD_ERROR 0xFE /*错误(回应)*/
#define CMD_OK 0xFC /*正确(回应)*/
#define DEV_SEND 0x01 /*发射器*/
#define DEV_RECV 0x02 /*接收器*/
/*获取appid所在的服务器*/
int get_port(char svrip[], int svrport, char dev, char appid[], char *ip, int *port)
{
int sock_fd = 0;
int i = 0;
int recbytes =0;
char buf[1024] = {0};
struct sockaddr_in s_add, c_add;
sock_fd = socket ( AF_INET, SOCK_STREAM, 0 );
if ( -1 == sock_fd )
{
return -1;
}
bzero ( &s_add,sizeof ( struct sockaddr_in ) );
s_add.sin_family = AF_INET;
s_add.sin_addr.s_addr = inet_addr (svrip);
s_add.sin_port = htons ( svrport );
if ( -1 == connect ( sock_fd, ( struct sockaddr * ) ( &s_add ), sizeof ( struct sockaddr ) ) )
{
return -1;
}
/*构造包,申请连接appid*/
buf[0] = CMD_JOIN; /*命令字*/
buf[1] = dev; /*设备类型*/
strcpy(buf + 2, appid);
write(sock_fd, buf, 18);
if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
{
return -1;
}
buf[recbytes] = '\0';
/*服务器收到申请后,会找一台与客户端最近的连接机,并返回其ip与port*/
if(buf[0] == CMD_REDIRECT)
{
for (i = 0; i < recbytes - 1; i++)
{
if (buf[i+1] == '_')
{
ip[i] = '\0';
break;
}
else
{
ip[i] = buf[i+1];
}
}
*port = atoi(buf+2+i);
}
else
{
return -1;
}
return 0;
}
/*从appid中接收数据*/
int recv_data(char svrip[], int svrport, char appid[])
{
int sock_fd = 0;
int i = 0;
int recbytes = 0;
char buf[1024] = {0};
struct sockaddr_in s_add, c_add;
sock_fd = socket ( AF_INET, SOCK_STREAM, 0 );
if ( -1 == sock_fd )
{
return -1;
}
bzero ( &s_add,sizeof ( struct sockaddr_in ) );
s_add.sin_family = AF_INET;
s_add.sin_addr.s_addr = inet_addr (svrip);
s_add.sin_port = htons ( svrport );
if ( -1 == connect ( sock_fd, ( struct sockaddr * ) ( &s_add ), sizeof ( struct sockaddr ) ) )
{
return -1;
}
/*构造包,申请连接appid*/
buf[0] = CMD_JOIN; /*命令字*/
buf[1] = DEV_RECV; /*接收类型设备*/
strcpy(buf + 2, appid);
write(sock_fd, buf, 18);
if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
{
return -1;
}
/*收到加入appid包之后,服务器返回CMD_OK状态*/
if((unsigned char)buf[0] == CMD_OK)
{
while (1)
{
/*循环接收数据*/
if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
{
return -1;
}
buf[recbytes] = '\0';
printf("%s", buf);
}
}
return 0;
}
int main(int argc,char *argv[])
{
char *master_ip = argv[1]; /*服务器ip*/
int master_port = 5615; /*服务器port*/
char *appid = argv[2]; /*APPID*/
char slaver_ip[100] = {0};
int slaver_port = 0;
get_port(master_ip, master_port, DEV_RECV, appid, slaver_ip, &slaver_port);
printf("slaver: %s %d\r\n", slaver_ip, slaver_port);
recv_data(slaver_ip, slaver_port, appid);
return 0;
}