Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #define PORT 5000
- #define MAXMSG 512
- int
- read_from_client (int filedes)
- {
- char buffer[MAXMSG];
- int nbytes;
- nbytes = read (filedes, buffer, MAXMSG);
- if (nbytes < 0)
- {
- /* Read error. */
- perror ("read");
- exit (EXIT_FAILURE);
- }
- else if (nbytes == 0)
- /* End-of-file. */
- return -1;
- else
- {
- /* Data read. */
- printf ("Server: got message: `%s'\n", buffer);
- //fprintf (stderr, "Server: got message: `%s'\n", buffer);
- return 0;
- }
- }
- int main (void)
- {
- //extern int make_socket (uint16_t port);
- int sock;
- fd_set active_fd_set, read_fd_set;
- int i;
- struct sockaddr_in clientname;
- ;
- //size_t size;
- int size;
- /* Create the socket and set it up to accept connections. */
- //sock = make_socket (PORT);
- if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("Server-socket() error lol!");
- /*just exit lol!*/
- exit(1);
- }
- printf("Server-socket() is OK...\n");
- /*"address already in use" error message */
- int yes=1;
- if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
- {
- perror("Server-setsockopt() error lol!");
- exit(1);
- }
- printf("Server-setsockopt() is OK...\n");
- /* bind */
- clientname.sin_family = AF_INET;
- clientname.sin_addr.s_addr = INADDR_ANY;
- clientname.sin_port = htons(PORT);
- //memset(clientname.sin_zero, '\0', 8);
- if(bind(sock, (struct sockaddr *)&clientname, sizeof(clientname)) == -1)
- {
- perror("Server-bind() error lol!");
- exit(1);
- }
- printf("Server-bind() is OK...\n");
- if (listen (sock, 1) < 0)
- {
- perror ("listen");
- exit (EXIT_FAILURE);
- }
- /* Initialize the set of active sockets. */
- FD_ZERO (&active_fd_set);
- FD_SET (sock, &active_fd_set);
- while (1)
- {
- /* Block until input arrives on one or more active sockets. */
- read_fd_set = active_fd_set;
- if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
- {
- perror ("select");
- exit (EXIT_FAILURE);
- }
- /* Service all the sockets with input pending. */
- for (i = 0; i < FD_SETSIZE; ++i)
- if (FD_ISSET (i, &read_fd_set))
- {
- if (i == sock)
- {
- /* Connection request on original socket. */
- int new;
- size = sizeof (clientname);
- new = accept (sock, (struct sockaddr *) &clientname, & size);
- if (new < 0)
- {
- perror ("accept");
- exit (EXIT_FAILURE);
- }
- FD_SET (new, &active_fd_set);
- }
- else
- {
- /* Data arriving on an already-connected socket. */
- if (read_from_client (i) < 0)
- {
- //close (i);
- //FD_CLR (i, &active_fd_set);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement