Problem ei server/ Client Anwendung



  • Hi @ all!

    Hab mich einwenig mit der socket Programmierung befasst und jetzt mal nen einfachen server geschrieben. Leider will er nicht so wie ich. Meine C++ Kenntnisse sind recht mager aber ich bin ein freund von learning by doing.
    Also zu meinem Problem...

    gcc ./server.cc -o ./server
    /tmp/ccW9bGYQ.o(.text+0x1b9): In function `__static_initialization_and_destruction_0(int, int)':
    : undefined reference to `std::ios_base::Init::Init[in-charge]()'
    /tmp/ccW9bGYQ.o(.text+0x1ea): In function `__tcf_0':
    : undefined reference to `std::ios_base::Init::~Init [in-charge]()'
    /tmp/ccW9bGYQ.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
    collect2: ld returned 1 exit status
    
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <netdb.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    #define BUFFER_SIZE 1024
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
    int s, c, bytes;
    
    char traf[] = "Hallo World";
    
    s = socket(PF_INET, SOCK_STREAM, 0);
    if (s == -1)
    {
    	perror("socket() failed");
    	return 1;
    }
    
    struct sockaddr_in addr;
    
    addr.sin_addr.s_addr = 	INADDR_ANY;
    addr.sin_port = 	htons(4000);
    addr.sin_family = 	AF_INET;
    
    if (bind(s, (struct sockaddr*) &addr, sizeof(addr)) == -1)
    {
    	perror("bind() failed");
    	return 2;
    }
    
    if (listen(s, 3) == -1)
    {
    	perror("listen() failed");
    	return 3;
    }
    
    struct sockaddr_in cli;
    socklen_t cli_size;
    cli_size = sizeof(cli);
    if ((c = accept(s, (struct sockaddr*) &cli, &cli_size)) == -1)
    {
    	perror("accept() failed");
    	return 4;
    }
    
    bytes = send(s, traf, 20, 0);
    if (bytes == -1)
    	return -1;
    
    bytes = recv(c, traf, 20, 0);
    if (bytes == -1)
    	return -1;
    
    return 0;
    
    }
    

    das ist der Code des Servers. Nichts tolles aber besser als nichts.
    habe send() und recv() als länger einfach mal 20 übergeben weil ich die größen ermittlung nicht als fehlerquelle in Frage kommen lassen wollte.

    Hat jemand ne idee oder tipps?



  • ok hab den fehler gefunden.
    sollte anstelle von vom gcc lieber g++ nehemn.



  • Hab ein neues Problem. Will das der client quasi in einer endlosschleife immer wieder auf eine Eingabe wartet und diese dann zum Server sendet der sie dann wiederrum auch wieder zum Client sendet.

    Hier mal ein stück vom client...

    while (true)
    {
    
    cin.get (traf3, 30);
    bytes = send(s, traf3, strlen(traf3)-1, 0);
    bytes = recv(s, traf3, 30, 0);
    
    cout << traf3 << "\n";
    }
    

    der server schickt einfach nur alles gesendete zurück. Zum testen gibt er auch das Empfangene aus.

    while((bytes = recv(c, traf, 30, 0)) > 0)
    {
    		cout << traf << "\n";
                    send(c, traf, bytes, 0);
    }
    

    Das ganze Funktioniert leider nur beim ersten Versuch danach kann man am Client Auch wieder eingeben aber es sieht aus als würde er es nicht senden.



  • Könnte es damit zu tun haben das cin.get das \n nicht mit aufnimmt und es sich dann noch im Puffer beffindet?


Anmelden zum Antworten