You want to use select or poll with a timeout value to detect if it is safe to call accept without it blocking.
void mainloop()
{
time_t startTime = time(NULL);
time_t listenTime = 10; // 10 seconds, for example
time_t elapsed = 0;
elapsed = time(NULL) - startTime;
secondsToWait = (elapsed >= listenTime) ? 0 : (listenTime-elapsed);
while (secondsToWait > 0)
{
fd_set readset = {};
FD_SET(my_sock_desc, &readset);
timeval waittime = {};
waittime.tv_sec = secondsToWait;
int count = select(my_sock_desc+1, &readset, NULL, NULL, &waittime);
if (FD_ISSET(my_sock_desc, &readset))
{
accept( my_sock_desc, (struct sockaddr *)&client_sock_addr, &sock_size );
}
elapsed = time(NULL) - startTime;
secondsToWait = (elapsed >= listenTime) ? 0 : (listenTime-elapsed);
}
}