私はゲートウェイサーバーと2つのクライアントを持っています(Oracle VM VirtualBoxで作成)。スレッド内のsleep()がメインをスリープさせます
私のゲートウェイサーバーでは、すべてのパケットをlistenするlistener.cがあります(while(1)
ループ内)。
クライアントが有効なトークンを送信する場合は、許可されたMACリストに入れなければなりません。許可されたMACからのすべてのパケットは180秒間転送する必要があります。 (換言すれば、180秒間のインターネットアクセスが可能)。
前に180秒、それは単一のユーザーとのものは働いていた。
/* authorized MACs list */
char *auth_macs[5];
int client;
pthread_mutex_t lock;
/* after 3 min remove the client from auth list */
void *timer(void *arg){
sleep(180);
pthread_mutex_lock(&lock);
auth_macs[client] = " ";
client--;
pthread_mutex_unlock(&lock);
return NULL;
}
これは私がタイマースレッドを実装しようとした方法です。 client
は、メイン関数で変更されるグローバル変数です。
if(has_token == 1){
client++;
sprintf(client_ip, "./accept.sh %s", sender);
system(client_ip);
auth_macs[client] = client_mac;
/* start timer thread */
pthread_t tid;
pthread_create(&tid, NULL, timer,NULL);
pthread_join(tid, NULL);
}
ここで私はこのスレッドを開始します。 accept.sh
は、転送を許可するシェルスクリプトです。
私の問題はです。タイマースレッドのsleep(180)
はそれ自体停止するつもりだと思いました。代わりに、listener.c
はパケットの受信を停止します。
どうすればこの問題を解決できますか?私はタイマーが180秒待つが、メイン機能でパケットを受信できるようにしたい。
'pthread_join'は、スレッドが終了するのを待ちます。しかし、それは長い間眠ります。 –