multithread-server/client-Implementierung in C

Ich habe gerade angefangen zu lernen, grundlegende Netzwerk-Konzepte.Ich bin zu versuchen, eine Multi-Thread-server-client-prog in C. aber das problem ist, anstelle der Ausführung mehrerer windows/Klemmen/Instanzen für die clients,die ich verwenden soll, fork() zu erstellen, die Kinder der Kunden.so durch die Schaffung von Kinder-client mehrere Mandanten erstellt werden.nun, jeder dieser untergeordneten clients kommunizieren mit dem server auf einen thread.

Früher erstellte ich ein ähnliches prog, aber in der, die für mehrere client-öffnen Sie mehrere Fenster für Kunden und führen Sie alle von Ihnen.

Ich habe Probleme wo zu ändern mein code (sowohl in server-und client-ones.Ich denke server ist ok.aber ich habe keine Ahnung, wo fork() im client-Programm und welche änderungen vorgenommen werden sollen).

Eigentlich möchte ich nicht mehrere Fenster öffnen, mehrere AUFTRAGGEBER,das ist, warum ich bin mit fork (), um mehrere Kopien erstellen.Gibt es irgendeine andere Weise, durch die ich erstellen kann, mehreren clients und schließen Sie Sie an meinem server prog über threads.

Server :

//socket server example, handles multiple clients using threads

#include<stdio.h>
#include<string.h>    //strlen
#include<stdlib.h>    //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h>    //write
#include<pthread.h> //for threading , link with lpthread

//the thread function
void *connection_handler(void *);

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( 3000 );

    //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);

        c=sizeof(struct sockaddr_in);
       while(client_sock=accept(socket_desc,(struct sockaddr*)&client,(socklen_t*)&c))
       {
        puts("Connection accepted");

        pthread_t sniffer_thread;
        new_sock = malloc(1);
        *new_sock = client_sock;

        if( pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock) < 0)
        {
            perror("could not create thread");
            return 1;
        }

        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 n;

        char    sendBuff[100], client_message[2000];

      while((n=recv(sock,client_message,2000,0))>0)
      {

        send(sock,client_message,n,0);
      }
      close(sock);

      if(n==0)
      {
        puts("Client Disconnected");
      }
      else
      {
        perror("recv failed");
      }
    return 0;
}

Client:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>

#define MAX_SIZE 50

int main()
{
    int sock_desc;
    struct sockaddr_in serv_addr;
    char sbuff[MAX_SIZE],rbuff[MAX_SIZE];

    if((sock_desc = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        printf("Failed creating socket\n");

    bzero((char *) &serv_addr, sizeof (serv_addr));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serv_addr.sin_port = htons(3000);

    if (connect(sock_desc, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) {
        printf("Failed to connect to server\n");
        return -1;
    }

    printf("Connected successfully - Please enter string\n");
    while(fgets(sbuff, MAX_SIZE , stdin)!=NULL)
    {
      send(sock_desc,sbuff,strlen(sbuff),0);

          if(recv(sock_desc,rbuff,MAX_SIZE,0)==0)
           printf("Error");
          else
           fputs(rbuff,stdout);

       bzero(rbuff,MAX_SIZE);//to clean buffer-->IMP otherwise previous word characters also came
    }
        close(sock_desc);
    return 0;

}
Warum wollen Sie fork() auf den client? Dies ist ungewöhnlich
Würde es Sinn machen, wenn der client-test-code zu simulieren, mehrere clients mit dem server verbinden.
Wenn Sie möchten, zu lernen, Netzwerk-Programmierung I schlage vor, Sie Blick auf modernere Konzepte als die Gabel. Untersuchen thread oder event-basierte IO. Die Verzweigung ist eine primitive und veraltete Modell für Netzwerk-Programme.
Filipe:Das ist' was mein Lehrer fragt mich.Eigentlich möchte ich nicht mehrere Fenster öffnen, mehrere AUFTRAGGEBER,das ist, warum ich bin mit fork (), um mehrere Kopien erstellen.Gibt es irgendeine andere Weise, durch die ich erstellen kann, mehreren clients und schließen Sie Sie an meinem server prog über threads.
Haben Sie vergessen, free(socket_desc) in connection_handler.

InformationsquelleAutor Shikhar Deep | 2014-01-28

Schreibe einen Kommentar