client connected nicht

Ich hab mal zu test zwecken nen client geschrieben der jetzt auf den dazugehörigen server connecten soll. Über das locale netzwerk funtioniert das auch soweit. wenn ich jetzt allerdings übers i net connecten will klappts nich. liegts an meinem router oder vlt doch am quellcode. komm selber nich drauf was falsch is.
hier der client
Code:
#include <iostream>
#include <windows.h>
#include <winsock2.h>

using namespace std;

int startWinsock(void)
{
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2, 0), &wsa);
}

int main()
{
    long rc;
    SOCKET s;
    SOCKET acceptSocket;
    SOCKET connectedSocket;
    SOCKADDR_IN addr;
    
    rc = startWinsock();
    
    if(rc != 0)
    {
        cout<<"winsock konnte nich gestartet werden"<<endl;
        return 1;
    }
    else;
    
    acceptSocket = socket(AF_INET, SOCK_STREAM, 0);
    if(acceptSocket == INVALID_SOCKET)
    {
        cout<<"Socket konnt enicht erstellt werden"<<endl;
        return 1;
    }
    else;
    
    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(80);
    addr.sin_addr.s_addr=ADDR_ANY;
    rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
    if(rc==SOCKET_ERROR)
    {
        cout<<"error"<<endl;
        return 1;
    }
    else
    cout<<"..."<<endl;
    
    rc=listen(acceptSocket,10);
    if(rc==SOCKET_ERROR)
    {
        cout<<"error"<<endl;
        return 1;
    } 
    else
    cout<<"listen"<<endl;
    
    connectedSocket=accept(acceptSocket,NULL,NULL);

if(connectedSocket==INVALID_SOCKET)

{

  printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
  cin.get();

  return 1;

}

else

{

  printf("Neue Verbindung wurde akzeptiert!\n");
  cin.get();

}
    cin.get();
}


und hier der server
Code:
#include <iostream>
#include <windows.h>
#include <winsock2.h>

using namespace std;

int startWinsock(void)
{
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2, 0), &wsa);
}

//char hostnameOrIp[256] = "boonserver.dyndns.org";

long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);

int main(int argc, char** argv)
{
    char buf[256];
    long rc;
    SOCKET s;
    SOCKADDR_IN addr;

    rc = startWinsock();
    
    if(rc != 0)
    {
        cout<<"winsock konnte nich gestartet werden"<<endl;
        cin.get();
        return 1;
    }
    else;
    
    s = socket(AF_INET, SOCK_STREAM, 0);
    if(s == INVALID_SOCKET)
    {
        cout<<"Socket konnt enicht erstellt werden"<<endl;
        cin.get();
        return 1;
    }
    else
    cout<<"Socket erstellt"<<endl;

    memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
    addr.sin_family=AF_INET;
    addr.sin_port=htons(80); // wir verwenden mal port 12345

    rc=getAddrFromString(argv[1],&addr);
    if(rc == SOCKET_ERROR)
    {
        cout<<"hostname konnte nicht aufgelöst werden"<<endl;
        cin.get();
        return 1;
    }
    else
    cout<<"hostname aufgelöst"<<endl;
    rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

    if(rc==SOCKET_ERROR)
    {
        printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        cin.get();
        return 1;
    }
    else
    cout<<"Verbunden ...."<<endl;
    
    cout<<"send:";
    cin>>buf;
    rc=send(s,buf,256,0);
    cin.get();
}

long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)

{
  hostnameOrIp = "hostname";
  long rc;

  unsigned long ip;

  HOSTENT* he;

  /* Parameter prüfen */

  if(hostnameOrIp==NULL || addr==NULL)
  {
    cout<<"socket error "<<endl;
    return SOCKET_ERROR;
  }
  /* eine IP in hostnameOrIp ? */

  ip=inet_addr(hostnameOrIp);

  /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */

  if(ip!=INADDR_NONE)

  {

    addr->sin_addr.s_addr=ip;
    return 0;

  }

  else

  {

    /* Hostname in hostnameOrIp auflösen */

    he=gethostbyname(hostnameOrIp);

    if(he==NULL)

    {

      return SOCKET_ERROR;

    }

    else

    {

      /*die 4 Bytes der IP von he nach addr kopieren */

      memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
    }

    return 0;

  }

}
 
ich bin mir nicht ganz sicher, aber hast du nicht den port vergessen? ;)
und ich seh die listen funktion des servers net?

oooder habe ich mich da verlesen, wenn ja sorry
 
Hmm... hab den Code nicht ganz durchgelesen, aber gesehen, dass du über Port 80 verbindest. /* Mir fällt grad auf, du benutzt das c-worker tut xD */
- Sagt nur der Client, dass es ein Problem gibt, der Server - oder kommt nicht der Ansatz einer Verbindung?
- Bist du dir sicher, dass auf dem Server-PC kein Webserver o.ä. läuft, der den Port blockiert?
- Wenn der Server üner einen Router verbindet, hast du die Ports entsprechend weitergeleitet?
 
ich glaube dass es an den ports liegen könnten ;)

aber dass der client und net der server einen listen funktion am laufen hat, sollte auch anders rum sein, meiner meinung nach
 
Saß noch mal ne weile dran und er connected jetzt. (router hat nichts weitergeleitet). allerding hab ich jetzt dass nächste problem dass daten die ich sende nich ankommen. Und 2tens dass er mir jetzt nen "socket error" wieder gibt weil er was gegen mein port hat aber gestern liefs noch mit dem selben port oÔ.
hier noch mal code ausschnitt


SERVER
Code:
.............
cout<<"connected ..."<<endl;
cin.get();
while(1)
{
       strcpy(buf,"blub");
       rc=send(acceptSocket,buf,9,0);
 }
..........


CLIENT
Code:
........
cout<<"connected ..."<<endl;
while(1)
{
        rc=recv(s,buf,256,0);
        buf[rc]='\0'; 
        cout<<buf;
}
............
 
versuch einfach mal einen anderen port ich glaube port 80 is für winsock unglücklich gewählt nimm einfach 12345 oda so möglicht einen noch nicht verwendeten, könnte sein dass der server des als http request interprätiert, weil ja über 80 ankommt ;)
 
hab ich vergessen zu erwähnen hab schon nen anderen port. daran kanns also nich liegen vorallem weil gestern mit dem port noch alles lief und jetzt gibt er mir nen socket error aus, und wenn ich wieder nen anderen pot nimm gibts keinen socketerror mehr. nur schon wieder den port ändern und im router umstellen is mir zu dumm.

Code:
memset(&addr,0,sizeof(SOCKADDR_IN));

addr.sin_family=AF_INET;

addr.sin_port=htons(1723);

addr.sin_addr.s_addr=ADDR_ANY;

rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
    if(rc==SOCKET_ERROR)                    //     <- hier bleibt bleibt er hängen
    {
        cout<<"error1"<<endl;
        return 1;
    }
 
also was mir noch nicht so ganz klar geworden ist, warum muss der client die verbindung annehmen?
des muss doch eigentlich nur der server machen oda?
der client muss doch nur ne anfrage stellen, ich glaube die server & client komponenten hast du ein wenig durcheinander geworfen?

so weit ich weiß musst du nur ein request auf den server starten, der client muss keine verbindung akzeptieren, also kein socketaccept im client versuchs ma
 
Gib doch mal die genaue Fehlermeldung an die du erhälst. Und ob es funktioniert wenn du zwischen dem beenden des Servers und dem neu starten ein paar Minuten wartest.
 
also er bringt die meldung "error" aus siehe hier rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));

if(rc==SOCKET_ERROR)
{
cout<<"error"<<endl;
return 1;
}

und wenn ich den port den er benutzen soll änder gibt er den fehler nich mehr aus also dann is rc != SOCKET_ERROR. verstanden ??
 
Ich meinte den Fehler aus WSAGetLastError(). Und meine Frage war ob es mit ein paar Minuten warten zwischen dem starten funktioniert.
 
Zurück
Oben