Ошибка привязки после перезапуска stunnel на ios

У меня есть сборка Stunnel для iOS, и она отлично работает, но при попытке перезапустить приложение вылетает.

Я начинаю это с 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 из-за этого: "Ошибка привязки:443 - 127.0.0.1:12345 bind: Адрес уже используется (48)" Файл конфигурации не изменился. Так почему порты все еще связаны с предыдущим потоком?

1 ответ

Решение

Вы закрыли сокет, когда отменили тему? Дескриптор файла сокета является общим для всего процесса. Если вы просто выбросите поток, сокет все еще будет открыт и привязан к этому порту, потому что сетевой уровень не имеет ни малейшего представления о том, сколько потоков вы используете, и не заботится о нем. Он только знает, что процесс все еще имеет открытый файл.

Другие вопросы по тегам