Intereting Posts
Зачем использовать переменные аргументы, когда списки инициализаций доступны? Хорошая hash-функция для индекса 2d Переопределить новый оператор в C ++, тогда как crtdbg.h вызывает конфликты Частный член взломал определенное поведение? Сериализация / десериализация структуры на char * в C Лучший подход к тестированию интерфейса QT Сериализовать вектор в C ++ для отправки через UDP Socket? glGetUniformLocation return -1 на картах nvidia Множественный пакет параметров Variadic для classа шаблонов Почему мы должны определить константный статический член, который инициализируется внутри classа C ++ вызов указателя статической функции захваченные переменные шкуры передают переменную в lambda. как показать? boost :: shared_ptr вопрос. Почему это работает? Как заставить экземпляр интеллектуальных указателей только для classа? Как мне обновить мой проект на C ++ в Visual Studio 2015, чтобы использовать новый универсальный CRT?

Ошибка recv (): Bad дескриптор файла c ++ Linux

У меня проблема. Моя программа включает в себя 10 TCP-серверов в Sam etime. Как только будет получен запрос от клиента, соответствующий сокет tcp-сервера примет соединение и обработает его в отдельном streamе. Я знаю, что это не самый эффективный способ решения моей реальной проблемы, но все в порядке.

В основном у меня есть цикл for, который вызовет функцию в объекте под названием Peer, который является StartThread ()

for (it= ListOfPeers.begin();it!= ListOfPeers.end();it++) { (*it).second->StartThread(); } 

Причина в том, что есть некоторые условия, в которых этот цикл будет использоваться, но я хотел сузить код как можно меньше.

Функция StartThread будет вызываться в каждом одноранговом объекте:

  void StartThread() { pthread_t threadDoEvent; pthread_create( &threadDoEvent, NULL, &DoEvent_helper,this); pthread_detach(threadDoEvent); } void *DoEvent_helper( void *ptr ) // Helper to implement thread { return ((Peer *)ptr)->DoEvent(); } 

DoEvent – это функция, которая будет обрабатывать запрос и соединение:

 void* DoEvent() { unsigned char buffer[1024]; int rc; int close_conn= FALSE; int new_sd; new_sd = accept(Socket, NULL, NULL); if (new_sd < 0) { if (errno != EWOULDBLOCK) { perror(" accept() failed"); close_conn = TRUE; } } do { rc = recv(new_sd, buffer, sizeof(buffer), 0); if (rc < 0) { if (errno != EWOULDBLOCK) { perror(" recv() failed"); close_conn = TRUE; } break; } if (rc == 0) { printf(" Connection closed\n"); close_conn = TRUE; break; } [DO SOMETHING WITH THE BUFFER] rc = send(new_sd, buffer, len, 0); if (rc <= 0) { perror(" send() failed"); close_conn = TRUE; break; } }while (close_conn==FALSE); close(new_sd); } 

Мой вопрос: почему я получаю сообщение об ошибке: recv () не удалось: Bad дескриптор файла ???? Когда я добавляю сон (1) между pthread_create и pthread_detach, все работает! Может ли кто-нибудь объяснить мне эти обстоятельства? или может помочь мне решить мою проблему?

Спасибо!

Ну, вы пытаетесь получить, даже если accept не выполняется. Это заставляет меня думать, что вы неправильно настроили пассивный дескриптор файла Socket прежде чем пытаться принять его.

Если вы настроили дескриптор Socket в основном streamе, то может быть, что новый stream запускается и запускается до того, как вы это сделаете.

Убедитесь, что new_sd находится в постоянной памяти. например, если она назначена функцией, которая запускает stream и завершает работу, то new_sd будет указывать на нежелательные сообщения. (по крайней мере, это было для меня)