Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Serverproblem

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
29.01.2007, 23:03 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hi, ich hab hier ein kleines Problem, in einer Serveranwendung.
Und zwar wird die Action in meiner Nachrichtnschleife nicht beim ersten mal ausgeführt. Ich hab das mal auf ein minimalstes beschränkt. Wenn man sich mit telnet auf Port 1200 connected, sieht man, das jede Eingabe wiederholt wird - nur die erste nicht. Und ich seh den Fehler nicht ...


C++:
    void accept()
    {
        this->AcceptSocket = SOCKET_ERROR;
        while( this->AcceptSocket == SOCKET_ERROR )
        {
            this->AcceptSocket = ::accept( this->ListenSocket, NULL, NULL );
        }
        std::cout << "Client connected." << std::endl;
        this->ListenSocket = this->AcceptSocket;
        while(true)
        {
            char buffer[1024];
            int bytes = recv(ListenSocket, buffer, sizeof(buffer) - 1, 0);
            buffer[bytes] = '\0';
            std::string foo = buffer;
            send(ListenSocket, foo.c_str(), foo.length(), 0);
        }
    }

Das wird in einer while(true) schleife aufgerufen
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.01.2007, 08:37 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


sizeof(buffer)-1 dürfte 3 ergeben

ansonsten überschreibst du dein Accept-Socket durch das vom Client.


C++:
    void accept()
    {
        this->AcceptSocket = SOCKET_ERROR;
        while( this->AcceptSocket == SOCKET_ERROR )
        {
            this->AcceptSocket = ::accept( this->ListenSocket, NULL, NULL );
        }
        std::cout << "Client connected." << std::endl;

        while(true)
        {
            char buffer[1024];
            int bytes = recv(ListenSocket, buffer, sizeof(buffer) - 1, 0);
            if(bytes <= 0) // connection-reset o.ä?
               break;
            buffer[bytes] = '\0';
            std::string foo = buffer;
            if(send(ListenSocket, foo.c_str(), foo.length(), 0) <= 0)
              break;
        }
        closesocket(this->AcceptSocket);
    }


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.01.2007, 14:33 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Ich hab das jetzt anderst gemacht und SOCKET jeweils in eine Vector gesichert, damit auch mehrere Verbindungen laufen können. So weit so gut.

Jetzt frage ich mich aber, wie ich an die IP und andere Daten des Clients komme. Mit inet_ntoa(sockaddr_in.s_addr) bekomm ich die IP, die zu sockaddr_in gehört - vom Client hab ich aber nur ein SOCKET Objekt - kann ich damit irgendwelche Daten auslesen zwecks logging?
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.01.2007, 16:17 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Ich habs. Bei accept gibt man einfach als 2tes und drittes Argument eine sockaddr_in Struktur an, in welche dann die Daten gesichert werden. Das 2te dann noch in sockaddr* casten und alles klappt wunderbar
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.01.2007, 16:35 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


oder getpeername benutzen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.01.2007, 18:05 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Na, ich hatte ja nur ein SOCKET ... Damit gehts nich
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.01.2007, 19:37 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


doch geht natürlich:


Zitat:


C++:
int getpeername(
  SOCKET s,
  struct sockaddr* name,
  int* namelen
);



Parameters
s
[in] Descriptor identifying a connected socket.

name
[out] The SOCKADDR structure that receives the name of the peer.
namelen
[in, out] Pointer to the size of the name structure, in bytes.



--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.01.2007, 19:38 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Oh, danke. Mein Fehler
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: