Newsgroup: it.comp.os.linux.iniziare
Titolo: Socket e chat

Per il corso di sistemi operativi dovrei realizzare il seguente progetto:
Scrivere un applicazione server e la relativa applicazione client, tali che:
SERVER: Il server, in ascolto su di uno port X (socket) accetta connessioni
dai client, che una volta connessi possono chiedere:
1.   un elenco dei client collegati;
2.   di inviare un messaggio a tutti i client;
3.   di inviare un messaggio ad un client della lista.
Il server può accettare più connessioni contemporaneamente e per ognuna crea
un thread che la gestisce.
CLIENT: Il client si connette al server e può inviare e ricevere messaggi
testuali e richiedere l'elenco dei client connessi.
Ho pochissimo tempo. Qualcuno sa se in rete potrei trovare qualcosa che mi
aiuti o magari di già fatto? :-)))
Grazie a tutti

 Grazie a tutti
Questi due funzionano su FreeBSD, forse dovrai cambiare qualcosa
o forse no.
----- SERVER.CPP -----
#include <iostream>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>
using namespace std;
void Error(const char* stringa) {
        cout<<stringa;
        exit(1);
}
int
main(int argc, char* argv[]) {
int sd;
int temp;
char charbuff[256];
if(argc<2) {
        cout<<"Uso: "<<argv[0]<<" <server_PORT>"<<'\n';
        exit(0);
 
 
}
socklen_t s_l;
struct sockaddr_in address, client;
in_port_t local_port;
local_port=htons(atoi(argv[1]));
bzero(&address, sizeof(address));
address.sin_family=AF_INET;
address.sin_port=local_port;
address.sin_addr.s_addr=htonl(INADDR_ANY);
sd=socket(AF_INET, SOCK_STREAM, 0);
if(sd<0) Error("socket error");
cout<<"Socket connected, now binding... ";
cout.flush();
temp=bind(sd, (const struct sockaddr*) &address, sizeof(address));
if (temp<0) Error("bind(...) error.\n");
else (cout<<"done.\n");
cout<<"Listening...";
if( listen(sd, 4) < 0 ) Error("Error on listen(...).\n");
cout<<" done.\n";
for(;;) {
        cout<<"<S>: Waiting SYN...\n";
        cout.flush();
        s_l=sizeof(client);
        temp=accept(sd, (struct sockaddr*) &client, &s_l);
        cout<<"<S>: connected!\n";
        inet_ntop(AF_INET, &client.sin_addr, charbuff, sizeof(charbuff));
        cout<<"<S>: Client is: "<<charbuff<<" from port:
"<<ntohs(client.sin_port)<<'\n';
        read(temp, &charbuff, sizeof(charbuff));
        cout<<"\n<S>: Server received: "<<charbuff<<'\n';
        write(temp, charbuff, sizeof(charbuff));
        cout<<"\nI wrote back the string.\n";
        close(temp);
}
close(sd);
return 0;
}
----- CLIENT.CPP -----
#include <iostream>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>
using namespace std;
void Error(const char* stringa) {
        cout<<stringa;
        exit(1);
}
int
main(int argc, char* argv[]) {
int sd;
int temp;
char buffer[256];
char rec_buffer[1024];
char c;
if(argc<3) {
        cout<<"Uso: "<<argv[0]<<" <server_IP> <server_PORT>"<<'\n';
        exit(0);
 
 
}
struct in_addr server_address;
struct sockaddr_in address;
in_port_t server_port;
if( (temp=inet_aton(argv[1], &server_address)) == 0 )
        Error("inet_aton(...) error.\n");
server_port=htons(atoi(argv[2]));
bzero(&address, sizeof(address));
address.sin_family=AF_INET;
address.sin_port=server_port;
address.sin_addr=server_address;
sd=socket(AF_INET, SOCK_STREAM, 0);
if(sd<0) Error("socket error");
cout<<"<C>: Connecting to server...\n";
cout.flush();
temp=connect(sd, (const sockaddr*) &address, sizeof(address));
if(temp==0) cout<<"<C>: connected.\n";
else {
        if(errno==ETIMEDOUT) Error(" time out.\n");
        if(errno=ECONNREFUSED) Error(" no one listening.\n");
        else Error(" generic error.\n");
}
cout<<"<C>: Messaggio al server: ";
cin.getline(buffer, sizeof(buffer));
write(sd, buffer, sizeof(buffer));
if(read(sd, &rec_buffer, sizeof(rec_buffer))<0) cout<<"Error.";
cout<<"Server returned: "<<rec_buffer<<'\n';
close(sd);
return 0;
}
----- FINE -----
Puoi modificare il server in modo da forkare un processo
per ogni richiesta che arriva.
SiMoStro


[CUT]
Grazie mille spero possa essermi utile. :-)))