I'm writing simple TCP server and I found some issue. Maybe you can help me a bit.So, I wrote an echo server first (to test connection with computer client). It's working okay, but now I need to change it a bit. Server should sent char[100] to client when it connects and sent same char[] to every client every X seconds/minutes.
I've trying many changes, but application only crashes. Commented some of my "mistakes" in this code.
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/time.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <errno.h>#include <unistd.h>/* BufferLength is 100 bytes */#define BufferLength 100/* Server port */#define SERVPORT 6000int main(){/* Variable and structure definitions. */int sd, wyslij, sd2, rc, length = sizeof(int);int totalcnt = 0, on = 1;char temp;char buffer[BufferLength];struct sockaddr_in serveraddr;struct sockaddr_in their_addr;fd_set read_fd;struct timeval timeout;timeout.tv_sec = 15;timeout.tv_usec = 0;char datadata[100] = "This is a test string from server lol!!! ";/* Get a socket descriptor */if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ perror("Server-socket() error"); /* exit */ exit (-1);}else printf("Server-socket() is OK\n");/* Allow socket descriptor to be reusable */if((rc = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on))) < 0){ perror("Server-setsockopt() error"); close(sd); exit (-1);}else printf("Server-setsockopt() is OK\n"); /* bind to an address */memset(&serveraddr, 0x00, sizeof(struct sockaddr_in));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(SERVPORT);serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);printf("Using %s, listening at %d\n", inet_ntoa(serveraddr.sin_addr), SERVPORT);if((rc = bind(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0){ perror("Server-bind() error"); /* Close the socket descriptor */ close(sd); /* and just exit */ exit(-1);}else printf("Server-bind() is OK\n");/* queue up to 10 clients */if((rc = listen(sd, 10)) < 0){ perror("Server-listen() error"); close(sd); exit (-1);}else printf("Server-Ready for client connection...\n");/* accept() the incoming connection request. */int sin_size = sizeof(struct sockaddr_in);if((sd2 = accept(sd, (struct sockaddr *)&their_addr, &sin_size)) < 0){ perror("Server-accept() error"); close(sd); exit (-1);}else printf("Server-accept() is OK\n");/*client IP*/printf("Server-new socket, sd2 is OK...\n");printf("Got connection from the client: %s\n", inet_ntoa(their_addr.sin_addr));/* Wait for up to 15 seconds on *//* select() for data to be read. */FD_ZERO(&read_fd);FD_SET(sd2, &read_fd);rc = select(sd2+1, &read_fd, NULL, NULL, &timeout);/* rc = write(sd2, datadata, sizeof(datadata)); */if((rc == 1) && (FD_ISSET(sd2, &read_fd))){/* rc = write(sd2, datadata, sizeof(datadata)); *//* Read data from the client. */totalcnt = 0; while(totalcnt < BufferLength){ /* read() from client */ rc = read(sd2, &buffer[totalcnt], (BufferLength - totalcnt)); if(rc < 0){ perror("Server-read() error"); close(sd); close(sd2); exit (-1); }else if (rc == 0){ printf("Client program has issued a close()\n"); close(sd); close(sd2); exit(-1); } else{ totalcnt += rc; printf("Server-read() is OK\n"); } }}else if (rc < 0){ perror("Server-select() error"); close(sd); close(sd2); exit(-1);}/* rc == 0 */else{ printf("Server-select() timed out.\n"); close(sd); close(sd2); exit(-1);}/* Shows the data */printf("Received data from the client: %s\n", buffer);/* write() some bytes of string, *//* back to the client. */printf("Server-Echoing back to client...\n");rc = write(sd2, datadata, sizeof(datadata));if(rc != totalcnt){ perror("Server-write() error"); /* Get the error number. */ rc = getsockopt(sd2, SOL_SOCKET, SO_ERROR, &temp, &length); if(rc == 0){ /* Print out the asynchronously */ /* received error. */ errno = temp; perror("SO_ERROR was: "); }else printf("Server-write() is OK\n"); close(sd); close(sd2); exit(-1); }/* Close the connection to the client and *//* close the server listening socket. */close(sd2);close(sd);exit(0);return 0;}
Thanks a lot buddies!