Skip to content
This repository has been archived by the owner on Sep 7, 2024. It is now read-only.

Fix network protocol #4

Open
jiep opened this issue Jul 17, 2021 · 1 comment
Open

Fix network protocol #4

jiep opened this issue Jul 17, 2021 · 1 comment
Assignees
Labels
bug Something isn't working

Comments

@jiep
Copy link
Owner

jiep commented Jul 17, 2021

No description provided.

@jiep jiep added the bug Something isn't working label Jul 17, 2021
@jiep jiep self-assigned this Jul 17, 2021
@jiep
Copy link
Owner Author

jiep commented Oct 3, 2021

Use this code to broadcast round 3 and 4.

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <pthread.h>
#include <sys/wait.h>

#define PORT 5555
#define hostNameLength 50
#define messageLength  256
#define N 5

typedef struct client_info {
  char message[messageLength];
  int  socket;
} client_info;

void initSocketAddress(struct sockaddr_in *name,
                       char *hostName,
                       unsigned short int port){

  struct hostent *hostInfo;
  name->sin_family = AF_INET;
  name->sin_port = htons(port);
  hostInfo = gethostbyname(hostName);
  if(hostInfo == NULL) {
    fprintf(stderr, "initSocketAddress - Unknown host %s\n",hostName);
    exit(EXIT_FAILURE);
  }
  name->sin_addr = *(struct in_addr *)hostInfo->h_addr;
}

void * sendMessage(void * params) {
    client_info* client_inf = (client_info*) params;
    int sockfd = client_inf->socket;

    printf("Sending '%s' to socket %d\n", client_inf->message, sockfd);
    int nOfBytes = 0;

    nOfBytes = write(sockfd, client_inf->message, strlen(client_inf->message) + 1);
    if (nOfBytes < 0) {
      perror("writeMessage - Could not write data\n");
    } else {
      printf("Sent %d bytes to socket %d!\n", nOfBytes, sockfd);
    }
}

void broadcast(int* sock, int n, char* message) {
  pthread_t t_id[n];
  printf("Creating threads...\n");

  for (int i = 0; i < n; i++) {
    struct client_info* client_inf = malloc(sizeof(struct client_info));
    client_inf->socket = sock[i];
    memcpy(client_inf->message, message, strlen(message) + 1);
    int read = pthread_create(&t_id[i], NULL, sendMessage, (void *) client_inf);
    if (read < 0) {
       printf("ERROR: Return Code from pthread_create() is %d\n", read);
       exit(1);
    } else {
      printf("Thread %d created successfully!\n", i);
    }
  }

  for (int i = 0; i < n; i++) {
    pthread_join(t_id[i], NULL);
  }

}

int create_client(char* hostname, int port) {
  struct sockaddr_in servername;
  int sock;

  sock = socket(PF_INET, SOCK_STREAM, 0);
  if(sock < 0) {
    perror("Could not create a socket\n");
    exit(EXIT_FAILURE);
  }

  initSocketAddress(&servername, hostname, port);
  if(connect(sock, (struct sockaddr *)&servername, sizeof(servername)) < 0) {
    printf("Could not connect to server %d\n", port);
    exit(EXIT_FAILURE);
  } else {
    printf("Connected to server: %d\n", port);
  }

  return sock;
}

void * run_client(char* hostname, int* ports, int n, char* message) {
  printf("Init client...\n");

  int sock[n];
  for (int i = 0; i < n; i++) {
    printf("Creating client %d\n", i+1);
    sock[i] = create_client(hostname, ports[i]);
  }

  broadcast(sock, n, (void*) message);

  // return NULL;
}

int main(int argc, char *argv[]) {
  int sock[N];
  int PORTS[N] = {5555, 5556, 5557, 5558, 5559};
  struct sockaddr_in serverName;
  char hostName[hostNameLength];
  char messageString[messageLength];
  char buffer[1024];
  if(argv[1] == NULL) {
    perror("Usage: client [host name]\n");
    exit(EXIT_FAILURE);
  } else {
    strncpy(hostName, argv[1], hostNameLength);
    hostName[hostNameLength - 1] = '\0';
  }

  if (fork() == 0){
    char MESSAGE[messageLength] = "Mensaje de prueba";
    run_client(hostName, PORTS, N, MESSAGE);
    int sock[N];
    for (int i = 0; i < N; i++) {
      printf("Creating client %d\n", i+1);
      sock[i] = create_client(hostName, PORTS[i]);
    }

    broadcast(sock, N, NULL);
    exit(0);
  } else {
    printf("Hello from parent!\n");
    wait(NULL);
  }
  return 0;
}

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant