根据服务器规则,是否有可能改进此函数以加快执行速度(甚至微秒)?
在这种情况下,非阻塞如何帮助我?执行次数比其他连接尝试次数少。在这种情况下,非阻塞是否有帮助?如何确保连接之间的等待时间?
关键点是从创建套接字到接收到读取的最快时间,以及每秒尽可能多的连接。
服务器规则/限制:
- 每12毫秒1个连接。如果您违反此规则并尝试提前连接,则IP将被阻止1200毫秒。
- 每次接收到读取时,连接都会关闭。
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
}
}
1条答案
按热度按时间c9x0cxw01#
我发现有两件事影响了程序的性能。
1.每次迭代的memset,你不需要,read会给你读取的字节数。
1.套接字和连接的创建。
从我的观点来看,你应该关注这个,但是我不清楚你的程序的意图是什么,一些家庭作业可能是?也是遗漏了函数do_job的作用。