Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Thread-Server

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.04.2008, 11:54 Uhr
~threadserver
Gast


Hallo,

Also ich habe mir ein Ziel gesetzt und zwar einen Server zu programmieren, welcher auf verschiedene Portranges auf Clients horcht. Sollte solch ein Client verbunden sein, soll es möglich sein vom Server aus dem client 3 verschiedene Befehle zu senden. (dir, whoami, help). Der Client selber ist schon komplett fertig programmiert und mit netcat getestet. Er funktioniert auch.

Beim Server jedoch habe ich meine Probleme, ich habe den komplett fertig jedoch, klappt das Befehle senden nicht.
Wenn ich zuerst "dir" sende bekomme ich die korrekte antwort!
Sende ich jetzt nochmals "dir" bekomme ich nur die halbe Ausgabe vom dir Befehl.
Sende ich jetzt "whoami" bekomme ich alles.
Jeder weitere Befehl jedoch, funktioniert nicht mehr. Sprich ich kann Ihn zwar senden, bekomme aber keine Ausgabe vom Client zurückgsendet!

Der Fehler liegt definitiv am Server und NICHT am Client, wie schon gesagt der Client funktioniert - getestet mit netcat. => Es muss am Server liegen.


Hier ist der Code:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <time.h>
#include <string.h>
#include <sys/stat.h>


#define BUFFER_SIZE 1024
char *port;
char command [2000];
int array[65535];
char in [10000];
char input_[10000];
int check = 0;


int connect_ (int port)
{
    int s, c;
    struct sockaddr_in srv, cli;
    socklen_t cli_size;

    s = socket(AF_INET, SOCK_STREAM, 0);


    srv.sin_addr.s_addr = INADDR_ANY;
    srv.sin_port = htons( (unsigned short int) port);
    srv.sin_family = AF_INET;

    if (bind(s,(struct sockaddr*) &srv, sizeof(srv)) == -1)
    {
            perror("bind() failed");
            return 3;
    }

    if (listen(s, 3) == -1)
    {
            perror("listen() failed");
            return 4;
    }

    for(;;)
    {
            
                cli_size = sizeof(cli);
            c = accept(s, (struct sockaddr *) &cli, &cli_size);
                   printf("Client connected on Port: \n");
        printf("%d\n", port);
        // Testen ob ein Befehl vorliegt!
        for (;;)
        {
            if (array[port] == 1)
            {
                array[port] = 0;
                
                send (c, command, strlen(command), 0);
                
                // Clear the fuck up :D
                // Warte auf Antwort
                check = recv(c, input_, sizeof(input_) -1, 0);
                if (check == -1)
                {
                    printf("Error receiving\r\n");
                }
                printf("%s", input_);
                
                int i = 0;

                for (i = 0; i < 10000; i++)
                {
                    command[i] = '\0';
                    in[i] = '\0';
                    input_[i] = '\0';
                }
            }
        }
        // EOF
            //close(c);
    }    
}

void input ()
{
    
    int p_port;

    for (;;)
    {
        scanf("%s", in);
        if (!strncmp(in, "use", 3))
        {    
            printf("Use command accepted, awaiting ID:\r\n");
            // Jetzt lesen wir die Zahl ein!
            scanf("%s", in);
            printf("ID accepted, awaiting command:\r\n");
            p_port = atoi(in);
            // Hier werden die Befehle erwartet
            
            for (;;)
            {
                scanf("%s", in);
                strcat (command, in);
                array[p_port] = 1;
            }
        }
        else
        {
            printf("Read the man page for more information\nHelp: use Port\r\n");
        }
        //printf("%s", in);
        //printf("\r\n");
    }
}

int main (int argc, char* argv[])
{
    if (argc < 3)
    {
        printf("Usage: ./server Number_of_listen_sockets startportnumber\n\n");
        return 1;
    }
    int k = atoi(argv[1]);
    int port = atoi(argv[2]);
    int i = 0;
    printf("%d\n", k);

    for (i=0; i<k; i++)
    {
        printf("Creating Socket on Port ");
        printf("%d", port + i);
        printf("\n");

        pthread_t tid;
        pthread_create(&tid, NULL, connect_, port+i);
        //connect_(port + i);
        //printf("%d", i);
    }
    // Creating main thread for IO
    pthread_t pid;
    pthread_create (&pid, NULL, input, NULL);

    for (;;)
    {
        sleep(120);
    }
}




Ich hoffe, dass mir jemand helfen kann,

Danke schonmals!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.04.2008, 08:53 Uhr
~ichwieder
Gast


keine idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.04.2008, 10:23 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
du liest zu schnell nach dem absenden des befehls, darum kommt u.U nur unvollständige Daten an.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.04.2008, 12:45 Uhr
~ichagain
Gast



Zitat von ~ichwieder:
keine idee?

Also würde ein usleep() bzw. sleep() den sachverhalt lesen?
bzw. wie weiß ich wann ich lesen kann und wann nicht?

außerdem....
recv() wartet doch so lange bis etwas ankommt?
Dann kann es doch nicht zu schnell sein, da recv wie gesagt wartet und wartet...




oder verstehe ich was falsch?
lg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.04.2008, 14:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja recv wartet solange bis irgendwas ankam, dann kommt es zurück. egal wieviel es gelesen hat. und ggf sind halt z.b grad paar hundert bytes übertragen und eben nicht. vielleicht solltest du dir eine art protokoll ausdenken, das du weißt wieviel du lesen musst z.b erstmal 4 byte mit der länge der daten schicken, und dann eben solange recv bis alle daten da sind.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.04.2008, 15:00 Uhr
~threadagain
Gast


Ich denke, das ist unrealistisch!

Wäre das der Fall, was du sagst, so würden die Ergebnisse zufällig kommen sprich.
Manchmal bekomme ich was, dann wieder nichts, manchmal das Ganze...

Jedoch bekomme ich das Ganze, dann nur ein Teil und dann einfach gar nichts mehr,
egal wie oft ich den Befehl sende...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: