Is there a possibility to improve this function for faster execution (even microseconds matter) according to the server rules?
How can non-blocking help me in this situation? Execution is less than the other connection attempt is possible. Can non-blocking help in this situation, and how can I ensure how much to wait between connections?
The point is the fastest time from socket creation to read received. And as many connections per second as possible.
Server rules/limitations:
- 1 connection every 12 milliseconds. If you break this rule and try to connect earlier, IP is blocked for 1200 milliseconds.
- Connection is closed every time read is received.
int main()
{
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
while(1)
{
clock_gettime(CLOCK_MONOTONIC, &end);
int elapsed_us = diff_us(end, start);
// wait until 12ms
if (elapsed_us < 12000)
{
usleep(12000-elapsed_us);
}
// check
clock_gettime(CLOCK_MONOTONIC, &start);
if (allowed(request)==1)
{
dojob();
return(0);
}
}
return 0;
}
int allowed(char request[])
{
char server_message[4096];
memset(server_message,'\0',sizeof(server_message));
int socket_desc = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = inet_addr(server);
connect(socket_desc, (struct sockaddr*)&server_addr, sizeof(server_addr));
write(socket_desc, request, strlen(request));
read(socket_desc, server_message, sizeof(server_message));
close(socket_desc);
char * ret = strstr(server_message, "OK");
if (ret)
return 1; // granted, do the job
else
{
uwait(10000);
return 0; // come back later, repeat asking for the allowance to do the job
}
}