problem beim versenden an alle clients
-
Hallo Leute,
ich will einen kleinen Server schreiben der Daten an alle Clients schickt über select. Nur wenn ich mit FD_ISSET teste komme ich nie in den zweig indem ich daten versenden kann. Ich hab wohl etwas übersehen, kann da jmd. mal draufkucken
gruss der gangster wrapper
Server
fd_set master; // master file descriptor list fd_set read_fds; // temp file descriptor list for select() fd_set write_fds; // temp file descriptor list for select() struct sockaddr_in myaddr; // server address struct sockaddr_in remoteaddr; // client address int fdmax; // maximum file descriptor number int listener; // listening socket descriptor int newfd; // newly accept()ed socket descriptor int yes=1; // for setsockopt() SO_REUSEADDR, below socklen_t addrlen; int i; FD_ZERO(&master); // clear the master and temp sets FD_ZERO(&write_fds); FD_ZERO(&read_fds); // get the listener if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } // lose the pesky "address already in use" error message if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { perror("setsockopt"); exit(1); } // bind myaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = INADDR_ANY; myaddr.sin_port = htons(PORT); memset(&(myaddr.sin_zero), '\0', 8); if (bind(listener, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1) { perror("bind"); exit(1); } // listen if (listen(listener, 10) == -1) { perror("listen"); exit(1); } // add the listener to the master set FD_SET(listener, &master); // keep track of the biggest file descriptor fdmax = listener; // so far, it's this one // main loop while(1) { read_fds = master; // copy it if (select(fdmax+1, &read_fds, &write_fds, NULL, NULL) == -1) { perror("select"); exit(1); } // run through the existing connections looking for data to read for(i = 0; i <= fdmax; i++) { if (FD_ISSET(i, &read_fds)) { // new client connection if (i == listener) { // handle new connections addrlen = sizeof(remoteaddr); if ((newfd = accept(listener, (struct sockaddr *)&remoteaddr, &addrlen)) == -1) { perror("accept"); } else { FD_SET(newfd, &master); // add to master set if (newfd > fdmax) { // keep track of the maximum fdmax = newfd; } cout << "selectserver: new connection from " << inet_ntoa(remoteaddr.sin_addr) << " on socket " << newfd << endl; } } } if(FD_ISSET(i, &write_fds)) {// stream data to clients if(i != listener) //except server { char text[] = "hello client\n"; int len; // handle data from a client if ( send(i, text, 14, 0) != -1) { cout << "error can't send on fd " << i << endl; cout << "actually send data " << len << endl; } } } } }
client
int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in their_addr; // connector's address information if (argc != 2) { fprintf(stderr,"usage: client hostname\n"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { // get the host info herror("gethostbyname"); exit(1); } if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; // host byte order their_addr.sin_port = htons(PORT); // short, network byte order their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero); if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof their_addr) == -1) { perror("connect"); exit(1); } if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { perror("recv"); exit(1); } buf[numbytes] = '\0'; printf("Received: %s",buf); close(sockfd); return 0;
-
habs selber geloest