Kompilierungsproblem



  • Ich habe ein Problem!
    Ich habe Visual C++ 6, und kann folgenden Quellcode nicht kompilieren:
    Der Fehler:
    "X:\selectchatsrv.cpp(131) : error C2065: 'ADDR_ANY' : nichtdeklarierter Bezeichner"

    // max. Anzahl Clients
    // Max. number of clients
    #define MAX_CLIENTS 100
    
    // Der Standartwert für FD_SETSIZE ist 64, dieser kann aber verändert
    // werden indem man FD_SETSIZE auf einen anderen Wert setzt bevor man
    // winsock2.h includiert.
    // FD_SETSIZE auf die max. Anzahl Clients setzten
    
    // The default value of FD_SETSIZE is 64, which can be modified by
    // defining FD_SETSIZE to another value before including Winsock2.h.
    // set FD_SETSIZE to the max. number of clients
    #define FD_SETSIZE   MAX_CLIENTS
    
    // includes...
    #include <stdlib.h>
    #include <stdio.h>
    //#include <windows.h>
    #include <winsock.h>
    #include <conio.h>
    
    // Stellt eine Verbindung mit einem Client dar
    // Represents a connection with a Client
    struct Connection {
       Connection() {
          used=false;
          socket=INVALID_SOCKET;
       }
       void set(SOCKET s, SOCKADDR_IN addr) {
          this->socket=s;
          this->addr=addr;
          this->used=true;
       }
       void erase() {
          this->used=false;
          this->socket=INVALID_SOCKET;
       }
       bool used;   // connection benutzt ? / connection slot used ?
       SOCKET socket; // socket
       SOCKADDR_IN addr; // client addr
    };
    
    // clients
    Connection clients[MAX_CLIENTS];
    
    // Sucht den nächsten freien Platz im clients Array
    // -1 = kein platz frei
    // Searches the next free slot in the clients array
    // -1 = no free slot
    int getFreeClientSlot() {
       for(int i=0;i<MAX_CLIENTS;i++) {
          if(clients[i].used==false)
             return i;
       }
       return -1;
    }
    
    // Sendet eine Nachricht an alle Clients
    // Send's a Message to all clients
    int sendToAllClients(char* msg) {
       int rc,i;
       for(i=0;i<MAX_CLIENTS;i++) {
          if(!clients[i].used)
             continue;
          rc=send(clients[i].socket,msg,strlen(msg),0);
          if(rc==SOCKET_ERROR) {
             printf("Error: Sending to Client %d failed: %d\n",i,WSAGetLastError());
          }
       }
       return 0;
    }
    
    // Startet Winsock und gibt einige Infos zur Version aus
    // Starts winsock and dumps some infos about the version
    int startWinsock() {
       int rc;
       WSADATA wsaData;
       rc=WSAStartup(MAKEWORD(2,0),&wsaData);
       printf("Return Code: %d\n",rc);
       if(rc==SOCKET_ERROR) {
          printf("Error, exiting!\n");
          return rc;
       }
       printf("Winsock started:\n");
       printf("Version: %d.%d\n",LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion));
       printf("High Version: %d.%d\n",LOBYTE(wsaData.wHighVersion),HIBYTE(wsaData.wHighVersion));
       printf("Description: %s\n",wsaData.szDescription);
       printf("System Status: %s\n",wsaData.szSystemStatus);
       return 0;
    }
    
    // main...
    int main() {
       // SOCKET welcher neue Verbindungen annimmt
       // SOCKET which accepts new connections
       SOCKET acceptSocket;
       SOCKADDR_IN addr;
       int rc,addrsize=sizeof(SOCKADDR_IN);
       unsigned int i,j;
       // fd_set
       fd_set fdSetRead;
       // timout für select() / timeout for select()
       timeval selectTimeout;
       // temporär benutz für neue verbindungen
       // temporary used for new connections
       Connection newConnection;
       // buffer
       char buf[1024];
    
       // clients array leeren / clear clients array
       memset(clients,0x0,sizeof(Connection)*MAX_CLIENTS);
    
       // start winsock
       rc=startWinsock();
       if(rc==SOCKET_ERROR)
          return 1;
    
       // socket erstellen / create socket
       acceptSocket=socket(PF_INET,SOCK_STREAM,0);
       if(acceptSocket==INVALID_SOCKET) {
          printf("Error, cannot create socket: %d\n",WSAGetLastError());
          return 1;
       }
    
       // sockt an port 1234 binden / bind socket to port 1234
       memset(&addr,0,sizeof(SOCKADDR_IN));
       addr.sin_family=AF_INET;
       addr.sin_port=htons(1234);
       addr.sin_addr.s_addr=ADDR_ANY;
       rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
        if(rc==SOCKET_ERROR) {
          printf("Error, bind() failed: %d\n",WSAGetLastError());
          return 1;
       }
    
       // auf verbindungen warten / listen for connections
       rc=listen(acceptSocket,10);
       if(rc==SOCKET_ERROR) {
          printf("Error,listen() failed: %d\n",WSAGetLastError());
          return 1;
       }
    
       // The parameter readfds identifies the sockets that are to be checked for readability.
       // If the socket is currently in the listen state, it will be marked as readable if an
       // incoming connection request has been received such that an accept is guaranteed to
       // complete without blocking.
    
       while(1) {
    
          // fd_set leeren / clear fd_set
          FD_ZERO(&fdSetRead);
    
          // den socket welcher verbindungen annimmt hinzufügen
          // add the SOCKET which accepts new connections
    
          FD_SET(acceptSocket,&fdSetRead);
          // alle clients hinzufügen
          // add all clients
          for(i=0;i<MAX_CLIENTS;i++) {
             if(clients[i].used)
                FD_SET(clients[i].socket,&fdSetRead);
          }
    
          // warten bis irgend ein socket bereit ist, wenn timout NULL ist kehrt select()
          // erst zurück wenn ein socket bereit ist, select() blockt also in diesem falle
          // wait until any socket is ready (timeout = NULL, block until one socket is ready)
          rc=select(0,&fdSetRead,NULL,NULL,NULL);
    
          // abbrechen bei einem fehler
          // break on error
          if(rc<1)
             break;
    
          printf("select() returned %d ready sockets\n",rc);
    
          for(i=0;i<fdSetRead.fd_count;i++) {
    
             // acceptSocket ?
             if(fdSetRead.fd_array[i]==acceptSocket) {
                // verbindung annehmen / accept new connection
                newConnection.socket=accept(acceptSocket,(SOCKADDR*)&newConnection.addr,&addrsize);
                rc=getFreeClientSlot();
                if(rc==-1) {
                   printf("Cannot accept new clients\n");
                   continue;
                }
                // zu den clients hinzufügen
                // add to clients
                clients[rc]=newConnection;
                clients[rc].used=true;
                printf("New Client accepted from %s\n",inet_ntoa(newConnection.addr.sin_addr));
                continue;
             }
    
             // ein client ?
             // a client ?
             for(j=0;j<MAX_CLIENTS;j++) {
                if(!clients[j].used)
                   continue;
    
                if(clients[j].socket==fdSetRead.fd_array[i]) {
                   rc=recv(clients[j].socket,buf,1023,0);
                   buf[rc]='\0';
                   // rc==0 => client hat die verbindung beendet
                   // rc==0 => client closed connection
                   if(rc==0) {
                      printf("Client %d (%s): closed connection\n",j,inet_ntoa(clients[j].addr.sin_addr));
                      closesocket(clients[j].socket);
                      clients[j].erase();
                      continue;
                   // rc==SOCKET_ERROR => fehler, verbindung beenden!
                   // rc==SOCKET_ERROR => error, close connection!
                   } else if(rc==SOCKET_ERROR) {
                      printf("Client %d (%s): Error %d\n",j,inet_ntoa(clients[j].addr.sin_addr),WSAGetLastError());
                        printf("Client %d (%s): Server aborts connection\n",j,inet_ntoa(clients[j].addr.sin_addr));
                      closesocket(clients[j].socket);
                      clients[j].erase();
                      continue;
                   // daten empfangen und an alle clients senden
                   // receive data and send it to all clients
                   } else {
                      printf("Client %d (%s): received '%s' \n",j,inet_ntoa(clients[j].addr.sin_addr),buf);
                      sendToAllClients(buf);
                   }
                }
             }
          }
       }
    
       // aufräumen
       // cleanup
       closesocket(acceptSocket);
       WSACleanup();
       printf("Server shutdown, press any key to exit\n");
       getch();
    }
    

    MfG,
    C++ Core



  • Hallo,

    du bist im falschen Forum (das ist kein MFC-Programm), aber trotzdem: includiere WINSOCK2.H statt winsock.h, oder verwende INADDR_ANY statt ADDR_ANY (aber ersteres ist vorzuziehen).

    MfG



  • Dieser Thread wurde von Moderator/in dEUs aus dem Forum MFC mit dem Visual C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Jetzt kommen die Fehler:

    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _WSAGetLastError@0
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _send@16
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _WSAStartup@8
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _WSACleanup@0
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _closesocket@4
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _recv@16
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _inet_ntoa@4
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _accept@12
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _select@20
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _listen@8
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _bind@12
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _htons@4
    selectchatsrv.obj : error LNK2001: Nichtaufgeloestes externes Symbol _socket@12



  • dann mußt du auch noch die entsprechende Library ws2_32.lib dazulinken.

    MfG



  • Hoffentlich nerve ich nicht 😉
    habe jetzt das unter alle includes geschrieben:

    #pragma comment( lib, "ws2_32.lib" )
    

    X:\selectchatclient.cpp(32) : warning C4101: 'rc' : Unreferenzierte lokale Variable
    X:\selectchatsrv.cpp(108) : warning C4101: 'selectTimeout' : Unreferenzierte lokale Variable
    X:\selectchatsrv.cpp(242) : warning C4715: 'main' : Nicht alle Steuerelementpfade geben einen Wert zurück



  • C++ Core schrieb:

    X:\selectchatclient.cpp(32) : warning C4101: 'rc' : Unreferenzierte lokale Variable

    Die Variable 'rc' wird zwar lokal erstellt, aber nie benutzt. Sie ist überflüssig.

    C++ Core schrieb:

    X:\selectchatsrv.cpp(108) : warning C4101: 'selectTimeout' : Unreferenzierte lokale Variable

    Die Variable 'selectTimeout' wird zwar lokal erstellt, aber nie benutzt. Sie ist überflüssig.

    C++ Core schrieb:

    X:\selectchatsrv.cpp(242) : warning C4715: 'main' : Nicht alle Steuerelementpfade geben einen Wert zurück

    Irgendwo wird die main-funktion beendet, gibt aber keinen Wert zurück (und bevor Du suchst: ganz am Ende fehlt ein return 0;)



  • C++ Core schrieb:

    X:\selectchatsrv.cpp(242) : warning C4715: 'main' : Nicht alle Steuerelementpfade

    Erschossen gehören sie für diese unglaublichen Übersetzungen. Zum Glück hab ich's auf Englisch.



  • Danke

    Noch ein Problem 🙄

    Kompilieren geht, wenn ich das Programm dann starte kommt aber Error, das bind() nicht initialisiert werden kann (10048)



  • Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden. Versuch mal einen anderen Port...



  • Gleiches Problem



  • Mit Port 99 gehts!!!!!!!!!



  • Du hast bestimmt end viele Programme installiert die die Ports nutzen. 🤡



  • Ja, ich habe so um die 10 Programme...
    z.B. Apache, aber das tut hier nix zur Sache

    Habe jetzt Port 99 für Text, 100 für Dateien, 101 für Server-Befehle, die gehen alle!


Anmelden zum Antworten