S
sergg
Всем привет. Мне необходимо написать многопоточный чат. При написании, у меня возникла проблема. Я пишу по примеру из "Самоучитель игры на WinSock2". В книге приведен пример эхо-сервера, т.е. написать на его примере сервер для чата - не должно составить особой проблемы.
Сейчас я нахожусь на стадии написания сервера. Возникла проблема с многопоточностью. В книге все просто: клиент коннектится к серверу а далее вызывается функция CreateThread с одним из параметров SexToClient, где SexToClient - функция, обслуживающая клиента. Вот код данной функции:
По этой функции у меня возникло несколько вопросов:
1) в строке "my_sock=((SOCKET *) client_socket)[0];" что значит [0]?
2) что значит DWORD WINAPI? Прошу не отправлять меня читать про WinApi. Я представляю что это такое, как и для чего используется. Просто прошу пояснить, что значат эти два слова перед описанием функции.
3) Ну и самый главный вопрос, который у меня возник. Как отправлять сообщение пользователя не ему самому, а всем пользователям сразу?
Я так понимаю, что надо как-то создать массив типа SOCKET, в котором будут хранится все сокеты, по которым подключены клиенты, и в цикле отправлять это сообщение всем, но как это сделать в потоке? Или может есть еще какие-нибудь варианты?
Подскажите, пожалуйста, ответы на эти вопросы.
Сейчас я нахожусь на стадии написания сервера. Возникла проблема с многопоточностью. В книге все просто: клиент коннектится к серверу а далее вызывается функция CreateThread с одним из параметров SexToClient, где SexToClient - функция, обслуживающая клиента. Вот код данной функции:
C++:
DWORD WINAPI SexToClient(LPVOID client_socket)
{
SOCKET my_sock;
my_sock=((SOCKET *) client_socket)[0];
char buff[20*1024];
#define sHELLO "Hello, Sailor\r\n"
// отправляем клиенту приветствие
send(my_sock,sHELLO,sizeof(sHELLO),0);
// цикл эхо-сервера: прием строки от клиента и возвращение ее клиенту
while( (int bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) &&
bytes_recv !=SOCKET_ERROR)
send(my_sock,&buff[0],bytes_recv,0);
// если мы здесь, то произошел выход из цикла по причине
// возращения функцией recv ошибки – соединение с клиентом разорвано
nclients++; // уменьшаем счетчик активных клиентов
printf("disconnect\n"); PRINTNUSERS
// закрываем сокет
closesocket(my_sock);
return 0;
}
1) в строке "my_sock=((SOCKET *) client_socket)[0];" что значит [0]?
2) что значит DWORD WINAPI? Прошу не отправлять меня читать про WinApi. Я представляю что это такое, как и для чего используется. Просто прошу пояснить, что значат эти два слова перед описанием функции.
3) Ну и самый главный вопрос, который у меня возник. Как отправлять сообщение пользователя не ему самому, а всем пользователям сразу?
Я так понимаю, что надо как-то создать массив типа SOCKET, в котором будут хранится все сокеты, по которым подключены клиенты, и в цикле отправлять это сообщение всем, но как это сделать в потоке? Или может есть еще какие-нибудь варианты?
Подскажите, пожалуйста, ответы на эти вопросы.