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_ANYbyo
-
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