Zu den Aufzeichnungen der tutorials.de-Live-Workshops
Like Tree1Danke
  • 1 Beitrag von SGSSGene
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
925
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    kickerxy123 kickerxy123 ist offline Mitglied Gold
    Registriert seit
    Mar 2008
    Beiträge
    143
    Hallo!
    Ich habe folgenden Server kompilieren können und er arbeitet auch wunderbar:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    
    #include <windows.h>
    #include <stdio.h>
    #define MAX_CLIENTS 10
    using namespace std;
     
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
     
    int main()
    {
      long rc;
      SOCKET acceptSocket;
      SOCKADDR_IN addr;
      char buf[256];
      char buf2[300];
      FD_SET fdSet;
      SOCKET clients[MAX_CLIENTS];
     
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
     
      acceptSocket=socket(AF_INET,SOCK_STREAM,0);
      if(acceptSocket==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
     
      memset(&addr,0,sizeof(SOCKADDR_IN));
      addr.sin_family=AF_INET;
      addr.sin_port=htons(12345);
      addr.sin_addr.s_addr=INADDR_ANY; 
      rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket an port 12345 gebunden\n");
      }
     
      rc=listen(acceptSocket,10);
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("acceptSocket ist im listen Modus....\n");
      }
    for(unsigned short i=0;i<MAX_CLIENTS;i++) 
      {
        clients[i]=INVALID_SOCKET;
      }
    while(1) 
      {
     
    FD_ZERO(&fdSet); // Inhalt leeren
        FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen
        
        // alle gültigen(!=INVALID_SOCKET) client sockets hinzufügen 
        for(unsigned short i=0;i<MAX_CLIENTS;i++) 
        {
          if(clients[i]!=INVALID_SOCKET)
          {
            FD_SET(clients[i],&fdSet);
          }
        }
     
    rc=select(0,&fdSet,NULL,NULL,NULL); 
        if(rc==SOCKET_ERROR) 
        {
          printf("Fehler: select, fehler code: %s\n",WSAGetLastError());
          return 1;
        }
           //wenn acceptSocket im fd_set(und platz) => verbindung annehmen
        if(FD_ISSET(acceptSocket,&fdSet)) {
          // einen freien platz für den neuen client suchen, und die verbingung annehmen
          for(unsigned short i=0;i<MAX_CLIENTS;i++)
          {
            if(clients[i]==INVALID_SOCKET) 
            {
              clients[i]=accept(acceptSocket,NULL,NULL);
              printf("Neuen Client angenommen (%d)\n",i);
              break;
            }
          }
        }
     
     
        // prüfen welche client sockets im fd_set sind
        for(unsigned short i=0;i<MAX_CLIENTS;i++) 
        {
          if(clients[i]==INVALID_SOCKET)
          {
            continue; // ungültiger socket=>i++
          }
          if(FD_ISSET(clients[i],&fdSet))
          {
            rc=recv(clients[i],buf,256,0);
            // prüfen ob die verbindung geschlossen wurde oder ein fehler auftrat
            if(rc==0 || rc==SOCKET_ERROR)
            {
              printf("Client %d hat die Verbindung geschlossen\n",i);
              closesocket(clients[i]);        
              clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben für andere
            } 
            else
            {
              buf[rc]='\0';
              // daten ausgeben und eine antwort senden
              printf("Client %d hat folgendes gesandt: %s\n",i,buf);
              // antwort senden
              sprintf(buf2,"Du mich auch %s\n",buf);
              send(clients[i],buf2,(int)strlen(buf2),0);
            }
          }
        }
      }
    }
    Jetzt wollte ich das ganze in winAPI verpacken, naja.. klappt eigentlich auch, nur, dass er sich jetzt bei acceptSocket aufhängt und nciht mehr reagiert!
    Hier ein CODEAuszug:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    
             if(lParam == (LPARAM)hStart)
             {
                 if(HIWORD(wParam) == BN_CLICKED)
             
    EnableWindow(hStart,false);
    EnableWindow(hEdit2,false);
    EnableWindow(hStandard,false);
    EnableWindow(hStop,true);
    GetWindowText(hEdit2, lpString2, GetWindowTextLength(hEdit2)+1);
    GetWindowText(hEdit3, lpString3, GetWindowTextLength(hEdit3)+1);         
                ofstream mo ("C:/Programme/server.txt",ios::trunc);
                mo << lpString2 << endl << lpString3;
                mo.close();
                delete lpString2; delete lpString3;
     
                               GetWindowText(hFortschritt, lpString_Fortschritt, GetWindowTextLength(hFortschritt)+1);
                               string bla ="Server wurde erfolgreich gestartet.";
                               str_fortschritt ="";
                               str_fortschritt+= lpString_Fortschritt;
                               str_fortschritt+="\r\n";
                               str_fortschritt+=bla;
                                   
                               SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());    
     
    rc=startWinsock();
     if(rc!=0)
      {
                str_fortschritt+="\r\n";
                str_fortschritt+="Fehler: StartWinsock, Fehler Code:";
                str_fortschritt+=rc;
                SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());
                return 1;
      }
      else
      {    str_fortschritt+="\r\n";
           str_fortschritt+="Winsock gestartet!";
           SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());    
      }  
     // Socket erstellen
      acceptSocket=socket(AF_INET,SOCK_STREAM,0);
     
      if(acceptSocket==INVALID_SOCKET)
      {
                str_fortschritt+="\r\n";
                str_fortschritt+="Fehler: Der Socket konnte nicht erstellt werden, fehler code: ";
                str_fortschritt+=WSAGetLastError();
                SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());
                return 1;
      }
      else
      {
           str_fortschritt+="\r\n";
           str_fortschritt+="Socket erstellt!";
           SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); 
      } 
      
    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family=AF_INET;
     
    addr.sin_port=htons(port);//Standard: 2001
    addr.sin_addr.s_addr=ADDR_ANY;
    rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
     
    if(rc==SOCKET_ERROR)
     
    {
                str_fortschritt+="\r\n";
                str_fortschritt+="Fehler: Socketbinding, fehler code: ";
                str_fortschritt+=WSAGetLastError();
                SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());
                return 1;
     
    }
     
    else
     
    {
           str_fortschritt+="\r\n";
           str_fortschritt+="Socket an Port ";
           string g;
    ifstream mo ("C:/Programme/server.txt");
    getline(mo,g,'\n');
    mo.close();
           str_fortschritt+=g;
           str_fortschritt+=" gebunden";
           SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); 
     
     
    }   
    SendMessage(hwnd,WM_SIZE,0,0);  //UpdateWindow
     
     
    rc=listen(acceptSocket,10);
     
    if(rc==SOCKET_ERROR)
     
    {
                str_fortschritt+="\r\n";
                str_fortschritt+="Fehler: Listen Socket, fehler code: ";
                str_fortschritt+=WSAGetLastError();
                SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());
                return 1;
    }
     
    else
     
    {
           str_fortschritt+="\r\n";
           str_fortschritt+="acceptSocket ist im listen Modus.....";
           SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());
           SendMessage(hwnd,WM_SIZE,0,0); 
    }  
      for(unsigned short i=0;i<MAX_CLIENTS;i++) 
      {
        clients[i]=INVALID_SOCKET;
      }
     while(1){  
     FD_ZERO(&fdset); //Inhalt leeren
     FD_SET(acceptSocket, &fdset);  //Den Socket der Verbindungen annimt hinzufügen
     
     //Alle gültigen(!=INVALID_SOCKET)client sockets hinzufügen:
            for(unsigned short i=0;i<MAX_CLIENTS;i++)
            {
                         if(clients[i]!=INVALID_SOCKET)
                             {
                                FD_SET(clients[i],&fdset);
                             }
            }
    rc = select(0,&fdset,NULL,NULL,NULL);
    if(rc==SOCKET_ERROR)
    {
     
           str_fortschritt+="\r\n";
           str_fortschritt+="select-Fehler, Code:";
           int vy = WSAGetLastError();
           char pq[256];                                 //int ->char Konvertierung!
           sprintf(pq, "%d",vy);
            str_fortschritt +=pq;
           SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());
           return 1;
    }
    //wenn accepsocket im fd_set ist und genügend platz => verbindung annehmen
    if(FD_ISSET(acceptSocket,&fdset))
    {
      //freien Platz suchen
      for(unsigned short i = 0; i< MAX_CLIENTS;i++)
      {
                   if(clients[i]==INVALID_SOCKET)
                   {
                            clients[i]=accept(acceptSocket,NULL,NULL);
                             str_fortschritt+="\r\n";
                             str_fortschritt+="Neuen Client ";
                             str_fortschritt+=i;
                             str_fortschritt+=" angenommen.";
                             str_fortschritt+=WSAGetLastError();
                             SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());                                             
                             break;
                   }
      }
    }
    //prüfen welche ClientSockets im fd_set sind:
    for(unsigned short i = 0; i<MAX_CLIENTS;i++)
    {
                 if(clients[i]==INVALID_SOCKET)
                 {
                              continue;//ungültig, =>weitermachen(i++)
                 }
                 if(FD_ISSET(clients[i],&fdset))
                 {
                               rc = recv(clients[i],buf,256,0);
                               //prüfen, ob Verbindung besteht, oder Fehler:
                               if(rc==0 || rc==SOCKET_ERROR)
                               {
                                      str_fortschritt+="\r\n";
                                      str_fortschritt+="Client ";
                                      str_fortschritt+=i;
                                      str_fortschritt+=" hat die Verbindung abgebrochen.";
                                      SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());  
                                      closesocket(clients[i]);
                                      clients[i]=INVALID_SOCKET; //Platz freimachen
                               }
                               else
                               {
                                      buf[rc]='\0';
                                      printf("Client %d hat dolgendes gesandt: %s\n",i,buf);
                                      sprintf(buf2, "Du mich acuh %s",buf);
                                      send(clients[i],buf2,(int)strlen(buf2),0);
                               }
                 }
    }   //FOR 
    } //WHILE
     
     
     
    } //hStart
        }//switch(messages)
     
        return 0;
    }//CALLBACKPROC.

    Vielen Dank für die Mühen schoneinmal!
    lg
    kickerxy
     

  2. #2
    SGSSGene SGSSGene ist offline Mitglied Gold
    Registriert seit
    Feb 2008
    Beiträge
    124
    Wenn ich das richtig sehe bleibt dein Programm bei "select()" stehen, den Select warrtet darauf bis der Socket bereit ist. Das Problem kannst du übergeben, in dem du einen Sinnvolen letzten Parameter übergibst, damit select sofort abbricht.
    der Part dürfte dann in etwa so aussehen:
    Code cpp:
    1
    2
    3
    
    timeval t_time
    t_time.tv_sec = t_time.tv_usec = 0;
    rc = select(0,&fdset,NULL,NULL,&t_time);

    mfg
    SGSSGene
    kickerxy123 bedankt sich. 

  3. #3
    kickerxy123 kickerxy123 ist offline Mitglied Gold
    Registriert seit
    Mar 2008
    Beiträge
    143
    Vielen Dank! Ich denke, dass bringt mich schon einen großen Schritt weiter!
    Ich habs eingebaut, hab auch mal ne variable in der while Schleife hochzählen lassen und in eine .txt schreiben lassen, deshalb weiß ich, dass er jetzt die whileschleife immerwieder ausführt und nicht mehr bei select stehenbleibt.
    Dennoch nimmt er keinen Client an, zumindestens denke ich das..., obwohl im client "verbunden" steht, hier der Auschnitt vom Client:
    Code :
    1
    2
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR){//...}else{//->Verbunden}
    Der Server jedoch ist in der whileschleife und reagiert nicht mehr, und zeigt auch nicht an, dass ein Client connected hat/will.


    #edit: mir ist grade noch etwas aufgefallen:
    Wenn ich ein folgendes machealso ein boolean auswerte
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    
    #include....
    ....
    bool verbunden = false;
    ....
    int WINAPI WinMain....
    .....
    while(1){
    if(verbunden==true){
    break;
    }else{
    FD_ZERO(&fdset); //Inhalt leeren
     FD_SET(acceptSocket, &fdset);  //Den Socket der Verbindungen annimt hinzufügen
     
     //Alle gültigen(!=INVALID_SOCKET)client sockets hinzufügen:
            for(unsigned short i=0;i<MAX_CLIENTS;i++)
            {
                         if(clients[i]!=INVALID_SOCKET)
                             {
                                FD_SET(clients[i],&fdset);
                             }
            }
       
            timeval t_timet_time;
            t_timet_time.tv_sec=t_timet_time.tv_usec=0;
            rc = select(0,&fdset,NULL,NULL,&t_timet_time);
    if(rc==SOCKET_ERROR)
    {
     
           str_fortschritt+="\r\n";
           str_fortschritt+="select-Fehler, Code:";
           int vy = WSAGetLastError();
           char pq[256];                                 //int ->char Konvertierung!
           sprintf(pq, "%d",vy);
           str_fortschritt+=pq;
           SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());
           return 1;
    }
    //wenn accepsocket im fd_set ist und genügend platz => verbindung annehmen
    if(FD_ISSET(acceptSocket,&fdset))
    {
      //freien Platz suchen
      for(unsigned short i = 0; i< MAX_CLIENTS;i++)
      {
                   if(clients[i]==INVALID_SOCKET)
                   {
                            clients[i]=accept(acceptSocket,NULL,NULL);
                             str_fortschritt+="\r\n";
                             str_fortschritt+="Neuen Client ";
                             str_fortschritt+=i;
                             str_fortschritt+=" angenommen.";
                             str_fortschritt+=WSAGetLastError();
                             SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str());        
                             verbunden = true;                                    
                             break;
                   }
      }
    }
    läuft es! Er nimmt einen neuen Client an, bricht dann natürlich ab, aber immerhin einen kann er jetzt annehmen
    Nun hab ich warscheinlich nur noch das Problem, dass er sich in der whileschleife zu sehr auslastet?

    lg
    kickerxy
    Geändert von kickerxy123 (23.11.08 um 13:53 Uhr)
     

  4. #4
    posi90 posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    111
    Hallo,

    Ich habe mir aus diversen Foren und Tutorial-Seiten einen Server und einen Client auf CMD-Fenster Basis ge*****t. Nun bin ich dabei den Server unter WinApi du *****en, nur weiß ich net wo ich meine select()-Schleife einbaun sollte... Kann mir jemand helfen****

    Hier wären meine Source-Dateien:
    http://www.megaupload.com/?d=T5UMOU7T

    mfg. Poseidon
     

  5. #5
    Avatar von ComFreek
    ComFreek ComFreek ist gerade online [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.206
    Blog-Einträge
    3
    So einige schreiben immer Sternchen (*****), was soll das heißen****

    Willst du etwa von der Konsolenanwendung zur richtigen Windows-Applikation portieren?
    Wann willst du denn den Code ausführen, beim Start? Nach einer Betätigung eines Button?
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

Ähnliche Themen

  1. [c++/winApi]Socket - Buttons
    Von kickerxy123 im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 02.12.08, 00:00
  2. socket programming problem mit select()
    Von scriptkiddiie im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 14.04.08, 16:19
  3. Antworten: 2
    Letzter Beitrag: 30.01.08, 10:24
  4. Antworten: 2
    Letzter Beitrag: 29.01.08, 14:59
  5. Server Socket und Client Socket
    Von spiderman21 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 23.10.07, 17:00