Domanda Client Socket fallisce al momento del bind

Ex0dIa_

Utente Electrum
4 Novembre 2019
336
43
61
156
Salve ragazzi, è una delle prime volte che scrivo dei socket in C, poiché li ho sempre scritti in python.
Ho creato un server e un client.
Il server funziona benissimo, mi ci posso connettere con netcat o altro e funziona.
Invece il client dà errore al momento del bind.

CLIENT:
C:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define SERVER_PORT 1234
#define SERVER_IP "127.0.0.1"

int main() {

  int sd;
  struct sockaddr_in server, client;


  if ((sd = socket(AF_INET, SOCK_STREAM, 0) <0)) {
    printf("Errore nella creazione del socket!\n");
    getchar();
    exit(1);
  } else {
    printf("Socket creato!\n");
  }

  // struttura client
  client.sin_family = AF_INET;
  client.sin_addr.s_addr = htonl(INADDR_ANY);
  client.sin_port = htons(0);

  if ((bind(sd, (struct sockaddr *)&client, sizeof client)) <0) {
    printf("Errore nel bind del socket!\n");
    getchar();
    exit(1);
  } else {
    printf("Bind del socket avvenuto con successo!\n");
    }

  //struttura server
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = inet_addr(SERVER_IP);
  server.sin_port = htons(SERVER_PORT);

  if(connect(sd, (struct sockaddr *)&server, sizeof(server))<0) {
    printf("Connessione non riuscita!\n");
    getchar();
    exit(1);
  } else {
    printf("Connessione Riuscita!\n");
  }
  printf("\n");

  close(sd);

  return 0;
}

SERVER:
C:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
// Domini e address family
#include <netinet/in.h>
// Strutture dati per socket
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 1234
#define MAX 200

int main() {

  int client_len;
  struct sockaddr_in server,client;
  int sd, fd;   // sd = SocketDescription
  char ricevuto[MAX];

  if ((sd = socket(AF_INET,SOCK_STREAM,0)) <0) {    // AF_INET = IPv4 / SOCK_STREAM = TCP/IP
    printf("Errore nella creazione del socket!");
    getchar();
    exit(0);
  } else {
    printf("Server creato con successo!\n");
  }

  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htonl(INADDR_ANY);
  server.sin_port = htons(PORT);

  if (bind(sd, (struct sockaddr *)&server,sizeof server)<0) {
    printf("Errore nel bind del server!");
    getchar();
    exit(0);
  } else {
    printf("Bind del socket avvenuto con successo!\n");
  }

  listen(sd, 1);    // 1(secondo parametro) = numero max di connessioni simultanee
  printf("Server in ascolto...\n");

  printf("\n\n");

  client_len = sizeof client;

  if ((fd = accept(sd, (struct sockaddr *)&client, &client_len)<0)) {
    printf("Errore nella connessione con il client!");
    getchar();
    exit(0);
  };

  printf("Connessione Effettuata!\n");
  printf("Ip client: %s\n", inet_ntoa(client.sin_addr));
  printf("Porta: %d\n", PORT);
  printf("\n");

  close(fd);

  return 0;
}
 
Hai fatto un macello. La funzione bind si usa solo lato server, mentre non serve creare 25 sockaddr_in basta quello del client per il client e quello del server per il server.
Ti lascio 2 pezzi di codice.

client:
C:
void setupSocketForClient() {
    struct sockaddr_in client;

    //Chiedo l'ip
    char ip[16];
    printf("Inserisci l'ip della stanza: ");
    scanf("%s", ip);
    printf("\n");

    //Creazione socket
    clientfd = socket(AF_INET, SOCK_STREAM, 0);
    if (clientfd < 0) {
        printError("Impossibile creare un socket!");
    }
    printf("Socket creato! \n");

    //Preparazione socket
    client.sin_family = AF_INET;
    client.sin_addr.s_addr = inet_addr(ip);
    client.sin_port = htons(PORT);

    //Connessione al server
    if ( connect(clientfd, (struct sockaddr*)&client, sizeof(client)) < 0 ) {
        printError("Impossibile connettersi al Server!");
    }
    printf("Connessione al server riuscita! \n");

}

server:
C:
void setupSocketForServer() {
    struct sockaddr_in server;

    //Creazione socket
    serverfd = socket(AF_INET, SOCK_STREAM, 0);
    if (serverfd < 0) {
        printError("Impossibile creare un socket!");
    }
    printf("Socket creato! \n");

    //Preparazione socket
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(PORT);

    //Bind server
    if ( bind(serverfd, (struct sockaddr*)&server, sizeof(server)) < 0 ) {
        printError("Bind del socket fallito!");
    }
    printf("Bind del socket fatto! \n");

    //Inizio ad ascoltare
    if ( listen(serverfd, 1) < 0 ) {
        printError("Impossibile mettersi in ascolto sul server!");
    }
    printf("In ascolto sul server!");

}
 
Ultima modifica:
Hai fatto un macello. La funzione bind si usa solo lato server, mentre non serve creare 25 sockaddr_in basta quello del client per il client e quello del server per il server.
Ti lascio 2 pezzi di codice.

client:
C:
void setupSocketForClient() {
    struct sockaddr_in client;

    //Chiedo l'ip
    char ip[16];
    printf("Inserisci l'ip della stanza: ");
    scanf("%s", ip);
    printf("\n");

    //Creazione socket
    clientfd = socket(AF_INET, SOCK_STREAM, 0);
    if (clientfd < 0) {
        printError("Impossibile creare un socket!");
    }
    printf("Socket creato! \n");

    //Preparazione socket
    client.sin_family = AF_INET;
    client.sin_addr.s_addr = inet_addr(ip);
    client.sin_port = htons(PORT);

    //Connessione al server
    if ( connect(clientfd, (struct sockaddr*)&client, sizeof(client)) < 0 ) {
        printError("Impossibile connettersi al Server!");
    }
    printf("Connessione al server riuscita! \n");

}

server:
C:
void setupSocketForServer() {
    struct sockaddr_in server;

    //Creazione socket
    serverfd = socket(AF_INET, SOCK_STREAM, 0);
    if (serverfd < 0) {
        printError("Impossibile creare un socket!");
    }
    printf("Socket creato! \n");

    //Preparazione socket
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(PORT);

    //Bind server
    if ( bind(serverfd, (struct sockaddr*)&server, sizeof(server)) < 0 ) {
        printError("Bind del socket fallito!");
    }
    printf("Bind del socket fatto! \n");

    //Inizio ad ascoltare
    if ( listen(serverfd, 1) < 0 ) {
        printError("Impossibile mettersi in ascolto sul server!");
    }
    printf("In ascolto sul server!");

}
Grazie mille davvero.
Ahahah sisì ho fatto un macello, ma era la prima volta che programmavo questi socket
Messaggio unito automaticamente:

Scusa se ti disturbo ancora, ma dal server adesso come faccio ad accettare un client?
 
C:
struct sockaddr_in clientInfo;
int clientSize = sizeof(clientInfo);

clientSocket = accept(serverSocket, (struct sockaddr*)&clientInfo, &clientSize);
if (clientSocket == -1)
{
        exit(1);
}

close(serverSocket); //Se non hai altre connessioni da accettare es.altri computer, meglio chiudere
 
C:
struct sockaddr_in clientInfo;
int clientSize = sizeof(clientInfo);

clientSocket = accept(serverSocket, (struct sockaddr*)&clientInfo, &clientSize);
if (clientSocket == -1)
{
        exit(1);
}

close(serverSocket); //Se non hai altre connessioni da accettare es.altri computer, meglio chiudere
Davvero grazie mille.
Sei stato gentilissimo!
 
Ti consiglio personalmente di chiedere su stack overflow ste robe di c, sono in veramente pochi che aiutano su queste cose.
Non so se non aiutano perchè non sanno o cosa, ma fatto sta che tutte le discussioni che ho creato su questo forum, raramente mi hanno aiutato e alla fine sono stato io mesi a sbattermi per capire.
(Dubito che non sappiano robe sui socket, sono 30 linee di codice il setup)
 
Ti consiglio personalmente di chiedere su stack overflow ste robe di c, sono in veramente pochi che aiutano su queste cose.
Non so se non aiutano perchè non sanno o cosa, ma fatto sta che tutte le discussioni che ho creato su questo forum, raramente mi hanno aiutato e alla fine sono stato io mesi a sbattermi per capire.
(Dubito che non sappiano robe sui socket, sono 30 linee di codice il setup)
Sisì, avevo chiesto anche su stack, però ho ricevuto una risposta solo qui
 
Su stack devi essere molto esaustivo nella descrizione del problema.
Comunque goditi i socket di linux, perchè appena passi su windows son cazzi
 
  • Mi piace
Reazioni: Ex0dIa_
Salve ragazzi, è una delle prime volte che scrivo dei socket in C, poiché li ho sempre scritti in python.
Ho creato un server e un client.
Il server funziona benissimo, mi ci posso connettere con netcat o altro e funziona.
Invece il client dà errore al momento del bind.

CLIENT:
C:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define SERVER_PORT 1234
#define SERVER_IP "127.0.0.1"

int main() {

  int sd;
  struct sockaddr_in server, client;


  if ((sd = socket(AF_INET, SOCK_STREAM, 0) <0)) {
    printf("Errore nella creazione del socket!\n");
    getchar();
    exit(1);
  } else {
    printf("Socket creato!\n");
  }

  // struttura client
  client.sin_family = AF_INET;
  client.sin_addr.s_addr = htonl(INADDR_ANY);
  client.sin_port = htons(0);

  if ((bind(sd, (struct sockaddr *)&client, sizeof client)) <0) {
    printf("Errore nel bind del socket!\n");
    getchar();
    exit(1);
  } else {
    printf("Bind del socket avvenuto con successo!\n");
    }

  //struttura server
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = inet_addr(SERVER_IP);
  server.sin_port = htons(SERVER_PORT);

  if(connect(sd, (struct sockaddr *)&server, sizeof(server))<0) {
    printf("Connessione non riuscita!\n");
    getchar();
    exit(1);
  } else {
    printf("Connessione Riuscita!\n");
  }
  printf("\n");

  close(sd);

  return 0;
}

SERVER:
C:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
// Domini e address family
#include <netinet/in.h>
// Strutture dati per socket
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 1234
#define MAX 200

int main() {

  int client_len;
  struct sockaddr_in server,client;
  int sd, fd;   // sd = SocketDescription
  char ricevuto[MAX];

  if ((sd = socket(AF_INET,SOCK_STREAM,0)) <0) {    // AF_INET = IPv4 / SOCK_STREAM = TCP/IP
    printf("Errore nella creazione del socket!");
    getchar();
    exit(0);
  } else {
    printf("Server creato con successo!\n");
  }

  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htonl(INADDR_ANY);
  server.sin_port = htons(PORT);

  if (bind(sd, (struct sockaddr *)&server,sizeof server)<0) {
    printf("Errore nel bind del server!");
    getchar();
    exit(0);
  } else {
    printf("Bind del socket avvenuto con successo!\n");
  }

  listen(sd, 1);    // 1(secondo parametro) = numero max di connessioni simultanee
  printf("Server in ascolto...\n");

  printf("\n\n");

  client_len = sizeof client;

  if ((fd = accept(sd, (struct sockaddr *)&client, &client_len)<0)) {
    printf("Errore nella connessione con il client!");
    getchar();
    exit(0);
  };

  printf("Connessione Effettuata!\n");
  printf("Ip client: %s\n", inet_ntoa(client.sin_addr));
  printf("Porta: %d\n", PORT);
  printf("\n");

  close(fd);

  return 0;
}
Perchè hai creato due socket nel client? Su Python la programmazione di rete funziona allo stesso modo...non puoi creare un socket del client e del server nello stesso script...comunque, l'importante è aver risolto