Find the answer to your Linux question:
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 ...
  1. #1
    Just 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!

    Code:
    lab8a.c: In function ‘main’:
    lab8a.c:154: error: expected declaration or statement at end of input
    Here is my code:
    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;
    }

  2. #2
    Just 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);
    		}

  3. #3
    Just Joined! neirons's Avatar
    Join Date
    Nov 2006
    Location
    Latvia, Liepaja
    Posts
    18
    Seems to author have typo mistake.
    They lost one bracket for program main loop.
    And, I think main loop is not so short

    Code:
    for(;;)
    	{
    		timeout.tv_sec = 15;
    		timeout.tv_usec = 0;
    		flag = 0;
             }
    If is not, my suggestion is:

    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;
    }
    Before line "return 0" should be one more bracket.

  4. #4
    Just 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!

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
...