Я довольно новичок в 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);
}
}
}