0

iOS 用の stunnel ビルドがあり、完全に動作しますが、再起動しようとするとアプリがクラッシュします。

私は pthread_create から始めています。再起動するコードは次のとおりです。

int ret;
ret = pthread_cancel(old_threadID);
if (ret != 0)
    NSLog(@"%i", ret);

void *res;
ret = pthread_join(old_threadID, &res);
if (ret != 0)
    NSLog(@"%i", ret);

if (res == PTHREAD_CANCELED)
    NSLog(@"main(): thread was canceled\n"); //This returns OK
else
    NSLog(@"main(): thread wasn't canceled (shouldn't happen!)\n");

//Begin new thread
pthread_t threadID;
//launch stunnel in a thread
int errorStunnel = pthread_create(&threadID, NULL, &stunnel_routine, (void *)fname);
NSLog(@"Error code!! : %i", errorStunnel); //error is 0.

このアプリがクラッシュした後。正常に起動できずにクラッシュします。これが原因で stunnel.log に表示されるように: "Error binding :443 to 127.0.0.1:12345 bind: Address already in use (48)" 構成ファイルは変更されませんでした。では、なぜポートがまだ前のスレッドにバインドされているのでしょうか?

4

1 に答える 1

0

スレッドをキャンセルしたときにソケットを閉じましたか? ソケット ファイル記述子は、プロセス全体で共有されます。スレッドを吹き飛ばしただけでも、ネットワーク層は実行中のスレッドの数を認識したり気にしたりしないため、ソケットはまだ開いており、そのポートにバインドされています。プロセスがまだfdを開いていることだけを知っています。

于 2013-11-06T02:02:24.567 に答える