Domanda [RISOLTO] [C] Client - Server

Stato
Discussione chiusa ad ulteriori risposte.

Man_in_Black

Utente Emerald
11 Giugno 2009
737
189
30
536
Ultima modifica:
salve community,
teoricamente con questo client e server posso comunicare con due computer collegati alla stessa rete locale?
Client:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
  int                sockfd, n;
  char               recvline[1025] ;
  struct sockaddr_in servaddr;
  if (argc != 2) {
    fprintf(stderr,"usage: %s <IPaddress>\n",argv[0]);
    exit (1);
  }
  if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    fprintf(stderr,"socket error\n");
    exit (1);
  }
    servaddr.sin_family = AF_INET;
    servaddr.sin_port   = htons(1024);
    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) < 0) {
      fprintf(stderr,"inet_pton error for %s\n", argv[1]);
      exit (1);
    }
  if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
    fprintf(stderr,"connect error\n");
    exit(1);
  }
  while ( (n = read(sockfd, recvline, 1024)) > 0) {
    recvline[n] = 0;
    if (fputs(recvline, stdout) == EOF) {
      fprintf(stderr,"fputs error\n");
      exit(1);
    }
  }
  if (n < 0) {
    fprintf(stderr,"read error\n");
    exit(1);
  }
  exit(0);
}

Server:
Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
int main(int argc, char **argv)
{
  int          listenfd, connfd;
  struct sockaddr_in  servaddr;
  char        buff[4096];
  time_t        ticks;
  if ( ( listenfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ) {
    perror("socket");
    exit(1);
    }
  servaddr.sin_family      = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port        = htons(1024);
  if ( bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) {
    perror("bind");
    exit(1);
  }
  if ( listen(listenfd, 1024) < 0 ) {
    perror("listen");
    exit(1);
  }
for ( ; ; ) {
    if ( ( connfd = accept(listenfd, (struct sockaddr *) NULL, NULL) ) < 0 ) {
      perror("accept");
      exit(1);
    }
    ticks = time(NULL);
    snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
    if ( write(connfd, buff, strlen(buff)) != strlen(buff)) {
      perror("write");
      exit(1);
    }
    close(connfd);
  }
}
 
Ultima modifica:
Una rete o è Internet (ossia la rete che collega tutto il mondo) o è una rete locale (che connette un numero limitato di dispositivi). "linea internet in locale" non ha significato.
Comunque, con quei due programmi puoi comunicare all'interno di qualsiasi rete: sia una rete locale, sia la rete Internet. Non solo teoricamente, anche praticamente.
L'importante è che la rete utilizzi il protocollo IPv4 (e Internet supporta ovviamente IPv4). Quindi puoi anche comunicare dall'Italia alla Cina o agli USA.
 
si scusami hai ragione dicevo rete locale, ero stanco quando scrivevo (ora aggiusto), provando a farlo in rete locale, questa teoria non funziona...
 
Appena testato e funziona. Sicuro di inserire l'indirizzo IP corretto? Per ottenerlo:
Da Windows, apri un terminale e dai il comando "ipconfig /all". Trova l'interfaccia di rete giusta; il campo "IPv4 Address"/"Indirizzo IPv4" è quello che ti interessa.
Da Linux, apri un terminale e dai il comando "ifconfig". Trova l'interfaccia di rete giusta; il campo "inet" è quello che ti interessa.
L'indirizzo inizia sicuramente con "192.168." (nel 99% è questo caso) oppure con "10." o con "172.".
Se stai da Windows, inoltre, il firewall di Windows potrebbe bloccare le richieste in ingresso. Prova a spegnere temporaneamente il firewall.
 
  • Mi piace
Reazioni: ~Wintersmok
Appena testato e funziona. Sicuro di inserire l'indirizzo IP corretto? Per ottenerlo:
Da Windows, apri un terminale e dai il comando "ipconfig /all". Trova l'interfaccia di rete giusta; il campo "IPv4 Address"/"Indirizzo IPv4" è quello che ti interessa.
Da Linux, apri un terminale e dai il comando "ifconfig". Trova l'interfaccia di rete giusta; il campo "inet" è quello che ti interessa.
L'indirizzo inizia sicuramente con "192.168." (nel 99% è questo caso) oppure con "10." o con "172.".
Se stai da Windows, inoltre, il firewall di Windows potrebbe bloccare le richieste in ingresso. Prova a spegnere temporaneamente il firewall.

Non funziona su Windows con quei headers
 
se possibile potete dire cosa bisogna cambiare nel codice per testarlo in locale?
Niente. Ripeto: quel codice è valido sia su rete locale LAN, sia su Internet, sia su qualsiasi altra rete supporti il protocollo di routing IPv4 - senza bisogno di alcuna modifica.
 
io ho linux, lo provo su rete locale ma non và, su due pc diversi, ma sulla stessa rete.
se lo provo sullo stesso pc funziona.
 
Stato
Discussione chiusa ad ulteriori risposte.