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;
}
fork()
auf den client? Dies ist ungewöhnlichWü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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen, die mehrere clients mit Gewinde. Erstellen Sie einen separaten thread für jeden client und dann von thread-handler auf dem server verbinden. Ich bin nicht sicher, ob es eine gute Möglichkeit ist oder nicht.
Code:
Für das Verständnis der Zweck, die ich verwendet
sleep
.REF:
http://www.amazon.com/UNIX-Network-Programming-Richard-Stevens/dp/0139498761
http://beej.us/guide/bgnet/
https://computing.llnl.gov/tutorials/pthreads/
führen Sie mit pthread.
gcc -o out clinet.c -lpthread
Was war das Problem?
seine Arbeitsmethoden in Ordnung.aber einige synch. Problem ist, dass es ich denke.... Server:-Socket erstellt, binden, fertig, Wartet auf eingehende verbindungen... Connection accepted-Handler zugewiesen Verbindung akzeptiert Handler zugewiesen Verbindung akzeptiert Handler zugewiesen Verbindung akzeptiert Handler zugewiesen Verbindung akzeptiert Handler zugewiesen Client Disconnected Client Disconnected Client Disconnected Client Disconnected Client Getrennt
client:-erfolgreich Verbunden-client:1 Für Gewinde : 1 Hallo Hallo Hallo $client erfolgreich Verbunden:2 Für Gewinde : 2 hi-anzeigen $client erfolgreich Verbunden:3 Für Gewinde : 3 anzeigen adas asd $client erfolgreich Verbunden:4 Für Gewinde : 4 adas - $erfolgreich Verbunden-client:5 Für Gewinde : 5 asd........ich bin nicht in der Lage zu posten die Ausgabe im richtigen format.tut mir Leid...'hi', was ich schrieb, wenn client 1 verbunden bekommt, bekommt auch client 2. warum?????
InformationsquelleAutor sujin
Erstens, wenn Sie
fork()
erstellen, erstellen Sie zusätzliche Prozesse, keine zusätzlichen threads. Zum erstellen weiterer threads, die Sie verwenden möchtenpthread_create
.Zweitens, als Sie ein student sind, ist die kanonische Antwort ist hier zu Lesen Stephens'. Dies ist nicht nur ein unschätzbares Werkzeug, auch für diejenigen von uns, die erfahren im schreiben der socket-I/O-Routinen, aber auch Sie enthält Beispiele von non-threaded non-forking async I/O und verschiedene Möglichkeiten zum hinzufügen von threads und forking zu Ihnen. Ich glaube, die, die Sie wollen, ist: http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0321637739 (Kapitel 14 wenn der Speicher dient). Dies sollte in Ihrer college-Bibliothek.
InformationsquelleAutor abligh