Wie behebe ich TCP Fehler



  • Hallo zusammen,

    ich habe ein C/S Programm bei dennen mehrere Clients viele viele Verbindungen zum Server aufmachen und gleich wieder schließen, nach einem kurzen Datenaustausch (soll so sein, ist ne UNI Aufgabe).

    Prinzipiell geht unser Programm. Wenn ich aber lokal mit 1 Server und 3 Clients teste, bekomme ich relativ schnell folgenden Fehler:

    TCPNetwork::request::connect: Cannot assign requested address
    

    auf der Client Seite wenn er versucht einen Socket zum senden seiner Anfrage an den Server aufzumachen. Der String "TCPNetwork..." bis "connect:" ist von mir. Mein Code für das senden sieht wie folgt aus:

    ssize_t TCPNetwork::request(const Server& server, void* req, size_t reqlen, void* res, size_t reslen, int timeout){
    
      fd_set rfds;          //set of descriptors
      struct timeval tv;    //the timeout
      tv.tv_sec = (long) timeout;
      tv.tv_usec = 0;
      int retval;
    
      //clear buffer !!!
      FD_ZERO(&rfds);               //clears the set
      FD_SET(sockfd, &rfds);        //adds the sockfd descriptor to the set
    
      //open socket
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockfd == ERROR){
    
        perror("TCPNetwork(port)::socket");
    
       // exit(1);
    
      }//End if
    
      //try to reuse the socket to prevent errors
      int on=1;
      if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR, &on, sizeof(on)) == ERROR){
    
        perror("TCPNetwork(port)::setsockopt");
    
        exit(1);
    
      }//End if
      if(setsockopt(sockfd,SOL_TCP,TCP_LINGER2, &on, sizeof(on)) == ERROR){
    
        perror("TCPNetwork(port)::setsockopt");
    
        exit(1);
    
      }//End if
    
      //connect
      if (connect(sockfd, (struct sockaddr*) &server, sizeof(server)) < 0)
        perror("TCPNetwork::request::connect");
    
      int rcvdbytes = 0;
    
      //loop
      do {
              //send
              if (write(sockfd, req, reqlen) < 0)
                perror("TCPNetwork::request::send");
    
              //use select for timeout, see manpages for further information for select
              retval = select(sockfd+1, &rfds, NULL, NULL, &tv);
              if (retval < 0){
                perror("TCPNetwork::request::select");
              }
              if(retval == 0){
                perror("TCPNetwork::request::select::Timeout");
              }
    
              //if not timeout return data
              rcvdbytes = read(sockfd, res, reslen);
              if (rcvdbytes <(int) reslen)
                perror("TCPNetwork::request::recv");
    
              //else loop again
      }while (!retval);
    
      //close port
      if (close(sockfd) == ERROR)
        perror("TCPNetwork::request::close");
    
      //return the size of the received message
      return rcvdbytes;
    }
    

    Leider führen die Socketoptions zu keinem Erfolg. Diese sollten gerade dies jedoch verhindern. Jemand ne Idee oder Tipp was ich falsch mache???

    :xmas1: :xmas2: :xmas1: :xmas2: :xmas1:

    gruß und dank.



  • hi,

    hat keiner einen tip für mich??? oder sind meine angaben zu ungenau?



  • connect(sockfd, (struct sockaddr*) &server, sizeof(server)) < 0)
    

    probier mal

    connect(sockfd, (sockaddr*) &server, sizeof(server))
    

    ansonsten, probier mal ne direkte eingabe...
    memset(&addrtel,0,sizeof(SOCKADDR_IN));
    addrtel.sin_family=AF_INET;
    addrtel.sin_port=htons(port);
    addrtel.sin_addr.s_addr=inet_addr("192.168.0.10") // INADDR_ANY

    byo



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Linux/Unix verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • mein tip wäre einfach asio zu verwenden


Anmelden zum Antworten