[C#]Client-Server con Socket in Linux

di il
3 risposte

[C#]Client-Server con Socket in Linux

Salve ragazzi, come da titolo sto cercando di creare una semplice applicazione client-server in linux.

Praticamente non voglio far altro che inserire da tastiera una stringa nel client e farla rappresentare nel server.

Una cosa banalissima ma non so perchè non funge.

Vi riporto i due codici, grazias

SERVER

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <time.h>
#include "wrapper.h"

#define PORT 1024

int main(int argc, char** argv) {
  system("clear");
  char lista_op[40] = {"1: Login \n2:Uscita"};
  char log_id[30];
  int listenfd, connfd,fin=1,scelta=0;
  struct sockaddr_in servaddr, utente, add_fd;
  socklen_t len;
  pid_t pid;
  
  
  
  //creazione socket
  listenfd = Socket(AF_INET, SOCK_STREAM, 0);
  //indirizzo server
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  //numero di porta del server
  servaddr.sin_port = htons(PORT);
  //assegnazione indirizzo
  Bind(listenfd, (struct sockaddr *) &servaddr, sizeof (servaddr));
  //in ascolto
  Listen(listenfd, 1030);
  
  printf("In attesa di connessioni...\n");
  while(1) {
    len = sizeof(utente);
    //accetta nuova connessione
    connfd = Accept(listenfd, (struct sockaddr *) &utente, &len);
    //crea fork
    if(Fork(pid) == 0) { //figlio
      close(listenfd);
      printf("\nAccettata la connessione con il client : %s\n\n", inet_ntoa(utente.sin_addr));
      //cliente connesso
      while(fin != 0)
      {
	system("clear");
	//invia la lista delle operazioni al client
	write(connfd, lista_op, 40);
	//leggo scelta del cliente
	read(connfd, &scelta, sizeof(scelta));
	printf("\nCliente: %d\n\n",scelta);
	switch (scelta) {
	  case 1:
	    system("clear");
	    printf("LOGIN\n");
	    //legge l'identificativo
	    read(connfd, log_id, sizeof(log_id));
	    printf("Identificativo inserito : %s",log_id);
	    break;
	    
	  case 2:
	    system("clear");
	    printf("\nCliente disconnesso\n");
	    close(connfd);
	    exit(1);
	    break;
	    
	  default:break;
	}
	
	close(connfd);
	exit(0);
	//fine fork figlio
      }
    }else { //padre
	close(connfd); //fine fork padre
      }
    }
  }
CLIENT

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include "wrapper.h"

#define PORT 1024

int main(int argc, char** argv)
{
  int sock,scelta,fin=1,ide=1;
  char buffer[40],logid[30], risp_log[40];
  struct sockaddr_in servaddr;
  
  sock=Socket(AF_INET, SOCK_STREAM, 0);
  servaddr.sin_port = htons(PORT);
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  
  Connect(sock, (struct sockaddr*) &servaddr, sizeof (servaddr));
  
  //invio identificativo al server
  write(sock,&ide,sizeof(ide));
  
  while (fin != 0) {
    //la funzione memset (void *memset(void*str,int c,size_t n) copia il carattere c ai primi n caratteri della stringa puntata
    //dall'argomento str
    memset(buffer, 0, strlen(buffer));
    printf("\n\n **BENVENUTO**\n\n");
    //ricevo la lista delle operazioni dal server
    read(sock,buffer,40);
    printf("\n%s\n",buffer);
    printf("inserire scelta");
    scanf("/%d",&scelta);
    while ((scelta < 1) || (scelta > 2 )) {
      printf("scelta non valida, riprovare");
      scanf("%d",&scelta);
    }
    //invio scelta al server
    write(sock, &scelta, sizeof(scelta));
    switch (scelta) {
      case 1 : 
	system("clear");
	printf("\nLOGIN");
	printf("\nInserire identificativo (MAX 30 caratteri) : ");
	scanf("%s",logid);
	//invio logid al server
	write(sock, &logid, sizeof(logid));
	//leggo la risposta dal server
	read(sock, risp_log, 40);
	printf("\n%s", risp_log);
	break;
	
      case 2 :
	printf("USCITA...");
	close(sock);
	exit(0);
	break;
	
      default:break;
    }
    
  }
  
  close(sock);
  exit(0);
}

3 Risposte

  • Re: [C#]Client-Server con Socket in Linux

    Up
  • Re: [C#]Client-Server con Socket in Linux

    Che c'entra C# ?

    Che sono tutte quelle funzioni che iniziano con la maiuscola ... Connect .. Listen ... ?
  • Re: [C#]Client-Server con Socket in Linux

    Hai ragione, ho dimenticato di postare questo codice
    #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <string.h>
    
    int Socket(int famiglia, int tipo, int protocollo) {
        int n;
        if ((n=socket(famiglia, tipo, protocollo)) < 0) {
            perror("errore socket");
        }
        return n;
    }
     
    int Connect(int sockfd, struct sockaddr *servaddr, socklen_t addrlen) {
        int n;
        if (connect(sockfd, servaddr, addrlen) < 0) {
         printf("l'errore è qui");
            perror("connect");
            n = 0;
        } else {
            n = 1;
        }
        return n;
    }
     
    int Bind(int sockfd, struct sockaddr *addr, socklen_t addrlen) {
        int n;
        if ((n = bind(sockfd, addr, addrlen)) < 0) {
            perror("bind");
        }
        return n;
    }
     
    int Listen(int sockfd, int lunghezza_coda) {
        int n;
        if ((n = listen(sockfd, lunghezza_coda)) < 0) {
            perror("listen");
        }
        return n;
    }
     
    int Accept(int sockfd, struct sockaddr *clientaddr, socklen_t *addr_dim) {
        int n;
        if ((n = accept(sockfd, clientaddr, addr_dim)) < 0) {
            perror("accept");
        }
        return n;
    }
     
    pid_t Fork()
    {
        pid_t pid;
        pid=fork(); 
        if(pid<0){
            
            perror("fork");
            exit(-1);
        }
        return pid;
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte