На самом деле это очень зависит от платформы, как это работает.
Если вы работаете в системе Linux, это действительно не сложно, вам просто нужно создать копию вашего процесса, используя «форк», что-то вроде следующего поможет:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet.h>
#include <signal.h>
#include <unistd.h>
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_Address.sin_port = htons(1234);
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
signal(SIGCHLD, SIG_IGN);
while(1)
{
char ch;
printf("Server Waiting\n");
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len)
// Here's where we do the forking, if you've forked already then this will be the child running, if not then your still the parent task.
if(fork() == 0)
{
// Do what ever the child needs to do with the connected client
read(client_sockfd, &ch, 1);
sleep(5); // just for show :-)
ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);
exit(0);
}
else
{
// Parent code here, close and loop for next connection
close(client_sockfd);
}
}
}
Возможно, вам придется немного повозиться с этим кодом. Я сейчас не рядом с Linux, чтобы выполнить тестовую компиляцию, и я в значительной степени набрал его по памяти.
Однако использование fork является стандартным способом сделать это на C в системе на основе Linux/Unix.
Под Windows это совсем другая история, и я не могу вспомнить весь необходимый код (в наши дни я привык кодировать на С#), но настройка сокета почти такая же, за исключением того, что вам нужно использовать API Winsock для лучшей совместимости.
Вы можете (во всяком случае, я считаю) по-прежнему использовать стандартные сокеты berkley под окнами, но они полны ловушек и дыр, для Windows winsock это хорошее место для начала:
http://tangentsoft.net/wskfaq/
Насколько мне известно, если вы используете Winsock, в нем есть что-то, что может помочь с нерестом и мультиклиентом, лично я, однако, обычно просто выделяю отдельный поток и копирую в него подключение к сокету, а затем возвращаюсь в цикл прослушивания моего сервера.
person
shawty
schedule
16.06.2012