PDA

View Full Version : [C] - SOCKET SELECT CHAT SOWFTWARE


Sangio
20-12-2011, 13:25
Ciao a tutti, ho realizzato per un progetto universitario un server che gestisca (tramite le socket) in ambiente windows , diverse connessioni in lettura/scrittura per un servizio di chat.
Ogni client all' avvio da come parametro un numero da 1 a 9 che indica quale PC sta usando e può scrivere / ricevere messaggi indicando un destinatario (pcX con X= ad un numero) ed un testo.
Per la parte client ho usato due programmi, da avviare in parallelo, client-send e client-recv , in uno ho il continuo prompt per scrivere msg, salvarli in un buffer ed inviarli al server(che li recapita), nell' altro ho continue recv per mostrare a video mittente e messaggi ricevuti.

Per ultimare il progetto dovrei unire i due programmi in uno solo, se stessi usando Unix userei dei p_thread e la chiamata fork(). in ambiente Windows non so come comportarmi, di seguito riporto i 2 programmi client-send e client-recv, qualcuno di voi ha voglia di darmi una mano?
grazie infinite!

CLIENT SEND

int sd,status,addrlen=sizeof(struct sockaddr_in);
struct sockaddr_in server;
char buffer[80];
char dest[5];
char ok[3];
char role[5]={"send"};
server.sin_family=PF_INET;
server.sin_addr.s_addr=inet_addr("172.25.14.47");
server.sin_port=htons(atoi("4000"));

sd=socket(PF_INET,SOCK_STREAM,0);
status = connect(sd,(struct sockaddr*)&server,addrlen);
status = send(sd,argv[1],2,0);
send(sd,role,5,0);
while(1){
printf("@: ");
scanf("%s",dest);
send(sd,dest,5,0);
if(strcmp(dest,"quit")==0)
break;
recv(sd,ok,3,0);
if(strcmp(ok,"ok")!=0) {
printf("Destinatario NON corretto.\n");
continue;
}
printf(": "); // RICHIESTA DEL TESTO
getchar();
gets(buffer);
send(sd,buffer,80,0);
status = recv(sd,ok,3,0);
if(status<0) {
printf("Server disconnesso.\n");
break;
}
if(strcmp(ok,"ok")!=0)
printf("Errore!\n");

}


CLIENT RECV

int sd,status,addrlen=sizeof(struct sockaddr_in),result;
struct sockaddr_in server;
char buffer[80];
char mitt[5];
char role[5]={"recv"};
server.sin_family=PF_INET;
server.sin_addr.s_addr=inet_addr("172.25.14.47");
server.sin_port=htons(atoi("4000"));

sd=socket(PF_INET,SOCK_STREAM,0);
status = connect(sd,(struct sockaddr*)&server,addrlen);
status = send(sd,argv[1],2,0);
send(sd,role,5,0);
while(1){
result = recv(sd,mitt,5,0);
recv(sd,buffer,80,0);
if(result<0) {
printf("Server disconnesso!.\n");
break;
}
printf("%s : %s.\n",mitt,buffer);
}


ho tralasciato le librerie/int main e le WSAStartup per semplicità e brevità del msg.
GRAZIE DI NUOVO ;-)