Portknoking: слежение за upd сокетами
Пытаюсь реализовать систему portknoking на upd сокетах. Залип на том, чтобы ожидать по таймеру подключение ко второму и 3 сокетам. Т.е. чтобы подключение только по одному порту не ломало систему. Что подскажите? И как предложите код оптимизировать?
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char**argv)
{
int sock1,sock2,sock3,namelen;
struct sockaddr_in addr1,addr2,addr3,reserv_addr;
char buf[1024];
char test[]={"1\n"};
int bytes_read;
sock1 = socket(AF_INET, SOCK_DGRAM, 0);
sock2 = socket(AF_INET, SOCK_DGRAM, 0);
sock3 = socket(AF_INET, SOCK_DGRAM, 0);
if((sock1 < 0)||(sock2 < 0)||(sock3<0))
{
perror("socket");
exit(1);
}
addr1.sin_family = AF_INET;
addr1.sin_port = htons(31546);
addr2.sin_family = AF_INET;
addr2.sin_port = htons(31644);
addr3.sin_family = AF_INET;
addr3.sin_port = htons(31544);
addr1.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock1, (struct sockaddr *)&addr1, sizeof(addr1)) < 0)
{
perror("bind");
exit(1);
}
while(1)
{
bytes_read = recvfrom(sock1, buf, 1024, 0, &reserv_addr, &namelen);
buf[bytes_read] = '\0';
printf(buf);
if (buf!=0)//(strncmp(buf,test,3)==0)
{
addr2.sin_addr.s_addr = addr1.sin_addr.s_addr;
break;
}
}
if(bind(sock1, (struct sockaddr *)&addr1, sizeof(addr1)) < 0)
{
perror("bind");
exit(1);
}
while(1)
{
bytes_read = recvfrom(sock1, buf, 1024, 0, &reserv_addr, &namelen);
buf[bytes_read] = '\0';
printf(buf);
if (buf!=0)
{
addr3.sin_addr.s_addr = addr1.sin_addr.s_addr;
break;
}
}
}