Socket

sccc

Utente Attivo
1,004
0
Ciao raga, qualcuno sa dove posso reperire materiale circa socket in c? Ho un esamuccio da fare e...la situazione è critica
 

sccc

Utente Attivo
1,004
0
Si, si, in ambiente Unix...ho messo a scaricare il file.... Sai, hai ragione x quanto riguarda il fatto che posso travare questo materiale su un motore di ricerrca, ma, dato che mi serve per una tesina, non vorrei correre il rischio di aver "lo stesso materiale di qualcun'altro".... ;-)
 

giamur

Nuovo Utente
2
0
Qualcuno può aiutarmi?

Salve ragazzi, ho realizzato un'applicazione client server "pari/dispari". Il client invia al server un'operazione del tipo 3*2 il server calcola il risultato e lo restituisce al client. Il client verifica se è pari o dispari e restituisce la risposta al server che la stampa a video.
Il problema è che all'inizio funziona, poi dopo un pò di volte il server riceve l'operazione + un carattere estraneo e il tutto si blocca. Potreste controllare il codice? Ci sto perdendo ore e ore. Grazie

Client

#include <stdio.h>
#include <stdlib.h>
#include "basic.h"
#include "my_inet.h"
void paridispari_cli(int);
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr;
int sa;
if((sa=socket(AF_INET, SOCK_STREAM, 0))<0)
err_sys("Errore nella socket");
bzero((char*)&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
servaddr.sin_addr.s_addr=inet_addr(argv[1]);
if(connect(sa,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
err_sys("Errore nella accept");
paridispari_cli(sa);
}
void paridispari_cli(int socket){
char positivo[]="SI", negativo[]="NO";
char rcvline[MAXLINE]="",sendline[MAXLINE]="";
int n,argomento=0;
while(fgets(sendline,MAXLINE,stdin)!=NULL){
if((n=writen(socket,sendline, strlen(sendline)))<0){
if(errno==EPIPE)
err_sys("Connessione del server chiusa prematuramente");
else
err_sys("Errore nella writen");}
printf("Ho inviato %sciao",sendline);
if((n=readline(socket,rcvline,MAXLINE))<0)
err_sys("Errore nella readline");
if(n==0)
err_sys("Server morto prematuramente");
printf("Ho letto %sciao",rcvline);
rcvline[strlen(rcvline)-1]='\0';
sscanf(rcvline, "%d", &argomento);
if((argomento%2)==0){
printf("%dargomento",argomento);
positivo[strlen(positivo)]='\n';
if((n=writen(socket,positivo,strlen(positivo)))<0){
if(errno==EPIPE)
err_sys("Connessione del server chiusa prematuramente");
else
err_sys("Errore nella writen");}}
if((argomento%2)!=0){
printf("%dargomento",argomento);
negativo[strlen(negativo)]='\n';
if((n=writen(socket,negativo,strlen(negativo)))<0){
if(errno==EPIPE)
err_sys("Connessione del server chiusa prematuramente");
else
err_sys("Errore nella writen");}}
strcpy(positivo,"SI");
strcpy(negativo,"NO");
}}



SERVER

#include <stdio.h>
#include <stdlib.h>
#include "basic.h"
#include "my_inet.h"
#include "my_signal.h"
#include <string.h>
void paridispari_srv(int);
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr,cliaddr;
int sa,sc,cli_len,pid;
if((sa=socket(AF_INET, SOCK_STREAM,0))<0)
err_sys("Errore nella socket");
bzero((char*)&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sa,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
err_sys("Errore nella bind");
if(listen(sa,8)<0)
err_sys("Errore nella listen");
if(signal(SIGCHLD, gestisci_zombie)<0)
err_sys("Errore nella signal");
for(;;){
cli_len=sizeof(cliaddr);
if((sc=accept(sa,(struct sockaddr*)&cliaddr,&cli_len))<0){
if(errno=EINTR)
continue;
else
err_sys("Errore nella accept");}
if((pid=fork())==0){
if(close(sa)<0)
err_sys("Errore nella close socket ascolto (figlio)");
paridispari_srv(sc);
if(close(sc)<0)
err_sys("Errore nella close socket connesso (figlio)");
exit(0);}
if(close(sc)<0)
err_sys("Errore nella close socket connesso (padre)");

}}
void paridispari_srv(int sock){
char sendline[MAXLINE]="", rcvline[MAXLINE]="",rcvline1[MAXLINE]="";
int addendo1=0, addendo2=0,risultato=0,n;
char operatore=' ';
for(;;){
printf("SONO QUI");
if((n=readline(sock,rcvline,MAXLINE))<0)
err_sys("Errore nella readline");

rcvline[strlen(rcvline)-1]='\0';
printf("Ho ricevuto %s",rcvline);
sscanf(rcvline, "%d %c %d", &addendo1, &operatore, &addendo2);
printf("Addendo1:%d Operatore:%c Addendo2:%d",addendo1,operatore,addendo2);
/*switch(operatore){
case '+': risultato=addendo1+addendo2;printf("Risultato:%d",risultato);break;
case '-': risultato=addendo1-addendo2;printf("Risultato:%d",risultato);break;
case '*': risultato=addendo1*addendo2;printf("Risultato:%d",risultato);break;
case '/': risultato=addendo1/addendo2;printf("Risultato:%d",risultato); break;
default: printf("Operazione non eseguibile\n");break;}*/
if(operatore=='+'){
risultato=addendo1+addendo2;
printf("Risultato %d",risultato);
}
else if(operatore=='-'){
risultato=addendo1-addendo2;
printf("Risultato %d",risultato);
}
else if (operatore=='*'){
risultato=addendo1*addendo2;
printf("Risultato %d",risultato);
}
else if (operatore=='/'){
risultato=addendo1/addendo2;
printf("Risultato %d",risultato);
}
else
printf("Operazione non effettuabile");


sprintf(sendline, "%d", risultato);
sendline[strlen(sendline)]='\n';
if((n=writen(sock,sendline,strlen(sendline)))<0)
err_sys("Errore nella writen");
printf("Ho inviato il risultato %s",sendline);
if((n=readline(sock,rcvline1,MAXLINE))<0)
err_sys("Errore nella receiveline");
printf("Ho ricevuto %s",rcvline1);
rcvline1[strlen(rcvline1)-1]='\0';
if(strcmp(rcvline1,"SI")==0){
printf("Il risultato è pari\n\n");}
else
printf("Il risultato è dispari\n\n");
}

}


GRAZIE
 

artemidis

Nuovo Utente
1
0
problema socket

ciao ragazzi. ho un problema con questa socket. non so dove sbattere la testa. la socket è in C e utilizo linux per compilarla. Vi scrivo la traccia:


Si realizzi un'applicazione Client/Server per eseguire un servizio di pagine
bianche (ricerca di numeri telefonici di utenti). Il Client richiede al Server
il numero di telefono dell'utente specificato da Cognome (e quindi
ovviamente potrà ricevere molti utenti con lo stesso cognome e nome diverso) e
contenuto nella rubrica NomeRubrica presente sul Server.
Il Server trasmette le informazioni richieste, avendo però cura di non
inviare le righe degli utenti che non hanno autorizzato il trattamento e la
comunicazione dei propri dati ad altri. Si supponga che le righe del
file con le informazioni degli utenti che hanno autorizzato la pubblicazione dei
dati personali contengano la stringa AUTORIZZO .
Ai fini della realizzazione, si supponga che tutti i file di rubrica siano
organizzati per righe e in ogni riga siano riportate le informazioni di
un utente (cognome e nome, indirizzo, telefono, consenso alla
pubblicazione).



Grazie
 

Entra

oppure Accedi utilizzando

Hot: E3 2021, chi ti è piaciuto di più?

  • Ubisoft

    Voti: 39 23.6%
  • Gearbox

    Voti: 3 1.8%
  • Xbox & Bethesda

    Voti: 103 62.4%
  • Square Enix

    Voti: 14 8.5%
  • Capcom

    Voti: 8 4.8%
  • Nintendo

    Voti: 21 12.7%
  • Altro (Specificare)

    Voti: 15 9.1%

Discussioni Simili