Я в некотором роде новичок в сетевом программировании и пытаюсь создать сервер сокетов, который мог бы обрабатывать несколько клиентов. Сервер будет связью между игроками и игровым движком для текстового приключения, написанного на c ++.
Я получил код, работающий для отдельных клиентов и для передачи данных между клиентом и сервером. Следующий шаг в реализации — сделать так, чтобы он мог обрабатывать несколько клиентов. Насколько я понимаю, fork это способ сделать это. У меня есть этот код, но я не могу заставить его работать.
while (1) {
cout << "Server waiting." << endl;
n = sizeof(struct sockaddr_in);
if ((clientSocket = accept(servSocket, (struct sockaddr*) (&client), (socklen_t*) (&n))) < 0) {
cerr << "Error: " << errno << ": " << strerror(errno) << endl;
}
if(fork() == 0){
cout << "Child process created. Handling connection with << " << inet_ntop(AF_INET, &client.sin_addr, buff, sizeof(buff)) << endl;
close(servSocket);
}
string sendmsg;
string recvmsg;
int bytesRecieved = 0;
char package[1024];
string playerMessage;
while(1){
bytesRecieved = recv(clientSocket, package, 1024, 0);
for (int offset = 0; offset < bytesRecieved/sizeof(char); ++offset) {
playerMessage += package[offset];
}
cout << playerMessage;
cin >> sendmsg;
sendmsg += "\n";
send(clientSocket, sendmsg.c_str(), sendmsg.size(), 0);
}
}
close(clientSocket);
close(servSocket);
return 0;
Я понимаю, что bind () и все до этого должно происходить до основного цикла с включенным в него fork (), поэтому я не стал включать это.
Спасибо заранее!
Создание процесса для каждого соединения в большинстве случаев является неправильным способом. Что делать, если у вас 20 000 игроков? Переключение контекста для 20 000 процессов приводит к чрезмерным нагрузкам на сервер.
Подумайте об использовании асинхронного программирования. boost::asio
это один из лучших вариантов тогда.
Других решений пока нет …