Results 1 to 4 of 4
Hello, the error I am receiving is below:
I think I am missing a "{" somewhere but I can't find out where or I can be totally wrong. Does anybody ...
- 11-27-2008 #1Just Joined!
- Join Date
- Sep 2008
- Location
- Buffalo, NY
- Posts
- 25
Need Help with one syntax error
Hello, the error I am receiving is below:
I think I am missing a "{" somewhere but I can't find out where or I can be totally wrong. Does anybody have any suggestions? Thanks!
Here is my code:Code:lab8a.c: In function ‘main’: lab8a.c:154: error: expected declaration or statement at end of input
Code:/* ** multi.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 9034 // port we're listening on int main(void) { struct timeval { int tv_sec; int tv_usec; }; fd_set master, // master file descriptor list read_fds; // temp file descriptor list for select() struct sockaddr_in myaddr, // server address remoteaddr; // client address int fdmax, // maximum file descriptor number listener, // listening socket descriptor newfd, // newly accept()ed socket descriptor nbytes, yes=1, // for setsockopt() SO_REUSEADDR, below i, j; char buf[256]; // buffer for client data socklen_t addrlen; struct timeval timeout; int flag; FD_ZERO(&master); // clear the master and temp sets FD_ZERO(&read_fds); // get the listener if ((listener = socket(PF_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 for(;;) { timeout.tv_sec = 15; timeout.tv_usec = 0; flag = 0; read_fds = master; // copy it if (select(fdmax+1, &read_fds, NULL, 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)) { // we got one!! 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; } printf("selectserver: new connection from %s on " "socket %d\n", inet_ntoa(remoteaddr.sin_addr), newfd); } } else { // handle data from a client if ((nbytes = recv(i, buf, sizeof(buf), 0)) <= 0) { // got error or connection closed by client if (nbytes == 0) { // connection closed printf("selectserver: socket %d hung up\n", i); } else { perror("recv"); } close(i); // bye! FD_CLR(i, &master); // remove from master set } else { // we got some data from a client for(j = 0; j <= fdmax; j++) { // send to everyone! if (FD_ISSET(j, &master)) { // except the listener and ourselves if (j != listener && j != i) { if (send(j, buf, nbytes, 0) == -1) { perror("send"); } } } } } } flag = 1; } } if(!flag) { strcpy(buf, "Fifteen seconds have passed since the last message.\n"); nbytes = strlen(buf) + 1; for(j = 0; j <= fdmax; j++) { // send to everyone! if (FD_ISSET(j, &master)) { // except the listener and ourselves if (j != listener && j != i) { if (send(j, buf, nbytes, 0) == -1) { perror("send"); } } } } } return 0; }
- 11-27-2008 #2Just Joined!
- Join Date
- Sep 2008
- Location
- Buffalo, NY
- Posts
- 25
After some further assistance - I got it to work.
Fix:
Code:// main loop for(;;) { timeout.tv_sec = 15; timeout.tv_usec = 0; flag = 0; } read_fds = master; // copy it if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) { perror("select"); exit(1); }
- 11-28-2008 #3
Seems to author have typo mistake.
They lost one bracket for program main loop.
And, I think main loop is not so short
If is not, my suggestion is:Code:for(;;) { timeout.tv_sec = 15; timeout.tv_usec = 0; flag = 0; }
Before line "return 0" should be one more bracket.Code:/* ** multi.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 9034 // port we're listening on int main(void) { struct timeval { int tv_sec; int tv_usec; }; fd_set master, // master file descriptor list read_fds; // temp file descriptor list for select() struct sockaddr_in myaddr, // server address remoteaddr; // client address int fdmax, // maximum file descriptor number listener, // listening socket descriptor newfd, // newly accept()ed socket descriptor nbytes, yes=1, // for setsockopt() SO_REUSEADDR, below i, j; char buf[256]; // buffer for client data socklen_t addrlen; struct timeval timeout; int flag; FD_ZERO(&master); // clear the master and temp sets FD_ZERO(&read_fds); // get the listener if ((listener = socket(PF_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 for(;;) { timeout.tv_sec = 15; timeout.tv_usec = 0; flag = 0; read_fds = master; // copy it if (select(fdmax+1, &read_fds, NULL, 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)) { // we got one!! 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; } printf("selectserver: new connection from %s on " "socket %d\n", inet_ntoa(remoteaddr.sin_addr), newfd); } } else { // handle data from a client if ((nbytes = recv(i, buf, sizeof(buf), 0)) <= 0) { // got error or connection closed by client if (nbytes == 0) { // connection closed printf("selectserver: socket %d hung up\n", i); } else { perror("recv"); } close(i); // bye! FD_CLR(i, &master); // remove from master set } else { // we got some data from a client for(j = 0; j <= fdmax; j++) { // send to everyone! if (FD_ISSET(j, &master)) { // except the listener and ourselves if (j != listener && j != i) { if (send(j, buf, nbytes, 0) == -1) { perror("send"); } } } } } } flag = 1; } } if(!flag) { strcpy(buf, "Fifteen seconds have passed since the last message.\n"); nbytes = strlen(buf) + 1; for(j = 0; j <= fdmax; j++) { // send to everyone! if (FD_ISSET(j, &master)) { // except the listener and ourselves if (j != listener && j != i) { if (send(j, buf, nbytes, 0) == -1) { perror("send"); } } } } } } return 0; }
- 12-02-2008 #4Just Joined!
- Join Date
- Sep 2008
- Location
- Buffalo, NY
- Posts
- 25
I think you are correct ^ *makes more sense
Well, I can compile the code but it is not running properly. When I run the code on the server (terminal 1) and the client on terminal 2 and terminal 3, I get notified that they are connected. I can send messages on both clients successfully. However, I never receive the message: "Fifteen seconds have passed since the last message." if I don't send anything after 15 seconds. Does anybody have any suggestions? Thanks!


Reply With Quote