c ++ сокет принимает блоки cout - PullRequest
       2

c ++ сокет принимает блоки cout

0 голосов
/ 14 сентября 2018

Я довольно новичок в C ++ / C в целом, поэтому извините, если этот вопрос может показаться глупым, но я действительно застрял здесь.

То, что я пытаюсь сделать, - это простой tcp-сервер, предоставляющий пользователю возможность принимать / отклонять входящие соединения.У меня есть функция с именем waitForConnection () , содержащая основной цикл.Он вызывается в основной функции после того, как сокет успешно связывается и помечается как пассивный.

Я ожидаю, что после подключения Клиента к серверу функция handleConnection () вызывается, заставляя главный цикл ждать, пока функция не будет выполнена, и только затем продолжать работу.Но на самом деле кажется, что основной цикл продолжается до следующего вызова accept () , который блокирует поток, до того, как handleConnection () будет полностью выполнен.Тестовый вывод «done» станет видимым только в том случае, если клиент подключится во второй раз и поток снова активируется.

Мне кажется, что код выполняется совершенно не по порядку, что, по моему мнению, не так.возможно, так как весь код должен выполняться в одном потоке.

Консольный вывод после первой попытки подключения («n» - ввод пользователя):

"Accept connection ? (y/n)"n

Консольный вывод после второй попытки подключения:

"Accept connection ? (y/n)"n 
"doneAccept connection ? (y/n)"

Обратите внимание, что IЯ не ищу обходного пути, используя select () или что-то подобное, я просто пытаюсь понять, почему код делает то, что он делает, и, возможно, как это исправить, изменив структуру.

int soc = socket(AF_INET, SOCK_STREAM, 0);

void handleConnection(int connectionSoc, sockaddr_in client){
   string choice;
   cout<<"Accept connection ? (y/n)";
   cin>>choice;
   if(choice=="y"||choice == "Y"){
     //do something here
   }else{
     close(connectionSoc);

   }
  cout<<"done";
}



void waitingForConnection(){

    while(running){

      sockaddr_in clientAddress;
      socklen_t length;
      length = sizeof(clientAddress);

      int soc1 = accept(soc,(struct sockaddr*)&clientAddress, &length);
      if(soc1<0){
          statusOutput("Connection failed");
      }else{
          handleConnection(soc1, clientAddress);
      }

   }

}

1 Ответ

0 голосов
/ 14 сентября 2018

Проблема в том, что вывод на std::cout буферизуется, и вы просто не видите этого, пока он не будет сброшен. Когда std::cin автоматически сбрасывает std::cout, вы получаете выход на следующий вход. Измените ваш вывод на:

std::cout << "done" << std::endl;

и вы получите ожидаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...