Quantcast
Channel: Linux TCP server, sending RAW data to few clients every X seconds - Stack Overflow
Viewing all articles
Browse latest Browse all 3

Linux TCP server, sending RAW data to few clients every X seconds

$
0
0

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!


Viewing all articles
Browse latest Browse all 3

Trending Articles