Outils pour utilisateurs

Outils du site


lang:c:net:client_serveur

Ceci est une ancienne révision du document !


Table des matières

TCP

Serveur

serveur.c
#define _GNU_SOURCE
#include <netinet/in.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
 
// the thread function
void *connection_handler(void *socket_desc);
 
int main(int argc, char *argv[]) {
  int socket_desc, client_sock, c, *new_sock;
  struct sockaddr_in server, client;
 
  // Create socket
  socket_desc = socket(AF_INET, SOCK_STREAM, 0);
  if (socket_desc == -1) {
    printf("Could not create socket");
  }
  puts("Socket created");
 
  // Prepare the sockaddr_in structure
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = INADDR_ANY;
  server.sin_port = htons(8888);
 
  // Bind
  if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
    // print the error message
    perror("bind failed. Error");
    return 1;
  }
  puts("bind done");
 
  // Listen
  listen(socket_desc, 3);
 
  // Accept and incoming connection
  puts("Waiting for incoming connections...");
  c = sizeof(struct sockaddr_in);
  while ((client_sock = accept4(socket_desc, (struct sockaddr *)&client,
                                (socklen_t *)&c, 0))) {
    puts("Connection accepted");
 
    pthread_t sniffer_thread;
    new_sock = (int *)malloc(sizeof(int));
    *new_sock = client_sock;
 
    if (pthread_create(&sniffer_thread, NULL, connection_handler,
                       (void *)new_sock) < 0) {
      perror("could not create thread");
      return 1;
    }
 
    // Now join the thread , so that we dont terminate before the thread
    // pthread_join( sniffer_thread , NULL);
    puts("Handler assigned");
  }
 
  if (client_sock < 0) {
    perror("accept failed");
    return 1;
  }
 
  return 0;
}
 
/*
 * This will handle connection for each client
 * */
void *connection_handler(void *socket_desc) {
  // Get the socket descriptor
  int sock = *(int *)socket_desc;
  int read_size;
  char *message, client_message[2000];
 
  // Send some messages to the client
  message = "Greetings! I am your connection handler\n";
  write(sock, message, strlen(message) + 1);
 
  message = "Now type something and i shall repeat what you type \n";
  write(sock, message, strlen(message) + 1);
 
  // Receive a message from client
  while ((read_size = recv(sock, client_message, 2000, 0)) > 0) {
    // Send the message back to client
    write(sock, client_message, strlen(client_message) + 1);
  }
 
  if (read_size == 0) {
    puts("Client disconnected");
    fflush(stdout);
  } else if (read_size == -1) {
    perror("recv failed");
  }
 
  // Free the socket pointer
  free(socket_desc);
 
  return 0;
}

Client

client.c
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
 
int main(int argc, char *argv[]) {
  int sock;
  struct sockaddr_in server;
  char message[1000], server_reply[2000];
 
  // Create socket
  sock = socket(AF_INET, SOCK_STREAM, 0);
  if (sock == -1) {
    printf("Could not create socket");
  }
  puts("Socket created");
 
  server.sin_addr.s_addr = inet_addr("127.0.0.1");
  server.sin_family = AF_INET;
  server.sin_port = htons(8888);
 
  // Connect to remote server
  if (connect(sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
    perror("connect failed. Error");
    return 1;
  }
 
  puts("Connected\n");
 
  // keep communicating with server
  while (1) {
    printf("Enter message : ");
    scanf("%s", message);
 
    // Send some data
    if (send(sock, message, strlen(message) + 1, 0) < 0) {
      puts("Send failed");
      return 1;
    }
 
    // Receive a reply from the server
    if (recv(sock, server_reply, 2000, 0) < 0) {
      puts("recv failed");
      break;
    }
 
    puts("Server reply :");
    puts(server_reply);
  }
 
  close(sock);
  return 0;
}

UDP

<note important>TODO cf. Archive Site</note>

lang/c/net/client_serveur.1547730731.txt.gz · Dernière modification : 2019/01/17 14:12 de root