Pare postów niżej pokazywałem taki prosty server chatu.
otrzebuje zrobic taki serwer i opisac jego dzialanie a pozniej prosty czat ze np napisze wiadomosc wysle i odrau pojawi sie u kogos, ale wiadomosc musi przejsc przez serwer natomiast nie ma byc zapamietana tylko od razu wyslana do usera albo unicestwiona.
Unicestwiona, to znaczy? Kiedy wiadomość ma zostać unicestwiona?
Podklejam jescze raz :- )
Jak widać logika prosta.
- Zapisujesz deskryptor połączenia
- Puszczasz wątek klienta
- Jeśli wiadomość nadeszła rozsyłasz do wszystkich oprócz siebie.
- Jeśli rozłączenie to kasujesz deskryptor.
#include <iostream>
#include <string.h>
#include <netinet/in.h>
#include <algorithm>
#include <sys/socket.h>
#include <thread>
/** usage, telnet localhost 8888 **/
std::vector<int> clients;
void connection_handler(int);
int main()
{
sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8888);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
int yes = 1;
int listen_socket = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
bind(listen_socket, (sockaddr*)&servaddr, sizeof(servaddr));
listen(listen_socket, 10);
int newfd = 0;
while((newfd = accept(listen_socket, nullptr, nullptr)) > 0)
{
clients.push_back(newfd);
std::thread client_thread(connection_handler, newfd) ;
client_thread.detach();
}
}
void connection_handler(int client)
{
int rcv_bytes = 0, snd_bytes = 0;
std::array<char, 250> buff = {0};
while((rcv_bytes = recv(client, buff.data(), buff.size(), 0)) > 0)
{
for(auto cli : clients){
if(cli != client)
send(cli, buff.data(), strlen(buff.data()), 0);
}
memset(buff.data(), 0, buff.size());
}
clients.erase(std::find(clients.begin(), clients.end(), client));
std::cout << client << " drop..\n";
}