Language

C TCP Socket EchoServer and Client

Memo
BW Server
Install Maintenance HTTPS Connector
ISM
Install
BWMAgent
Linux Compile

C Language TCP Socket EchoServer&Client Sample Source

C Socket EchoServer

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#define MAX_CONNECTIONS 100

int create_tcp_server_socket(int port) {
    struct sockaddr_in saddr;
    int fd, ret_val;

    /* Step1: create a TCP socket */
    fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (fd == -1) {
        fprintf(stderr, "socket failed [%s]\n", strerror(errno));
        return -1;
    }
    printf("Created a socket with fd: %d\n", fd);

    /* Initialize the socket address structure */
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(port);
    saddr.sin_addr.s_addr = INADDR_ANY;

    /* Step2: bind the socket to port 7000 on the local host */
    ret_val = bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in));
    if (ret_val != 0) {
        fprintf(stderr, "bind failed [%s]\n", strerror(errno));
        close(fd);
        return -1;
    }

    /* Step3: listen for incoming connections */
    ret_val = listen(fd, 5);
    if (ret_val != 0) {
        fprintf(stderr, "listen failed [%s]\n", strerror(errno));
        close(fd);
        return -1;
    }
    return fd;
}

int main (int argc, char* argv[]) {
    fd_set read_fd_set;
    struct sockaddr_in new_addr;
    int server_fd, new_fd, ret_val, i, len, bytesRead;
    int port = atoi(argv[1]);
    socklen_t addrlen;
    char buf[DATA_BUFFER];
    char length[8];
    int all_connections[MAX_CONNECTIONS];

    /* Get the socket server fd */
    server_fd = create_tcp_server_socket(port);
    if (server_fd == -1) {
        fprintf(stderr, "Failed to create a server\n");
        return -1;
    }

    /* Initialize all_connections and set the first entry to server fd */
    for (i=0;i < MAX_CONNECTIONS;i++) {
        all_connections[i] = -1;
    }
    all_connections[0] = server_fd;

    while (1) {
        FD_ZERO(&read_fd_set);
        /* Set the fd_set before passing it to the select call */
        for (i=0;i < MAX_CONNECTIONS;i++) {
            if (all_connections[i] >= 0) {
                FD_SET(all_connections[i], &read_fd_set);
            }
        }

    	struct timeval readWait;
    	readWait.tv_sec = 10;
    	readWait.tv_usec = 0;

        /* Invoke select() and then wait! */
        printf("\nUsing select() to listen for incoming events\n");
        ret_val = select(FD_SETSIZE, &read_fd_set, (fd_set *)0,(fd_set *)0,&readWait);

        /* select() woke up. Identify the fd that has events */
        if (ret_val >= 0 ) {
            printf("Select returned with %d\n", ret_val);
            /* Check if the fd with event is the server fd */
            if (FD_ISSET(server_fd, &read_fd_set)) {
                /* accept the new connection */
                printf("Returned fd is %d (server's fd)\n", server_fd);
                new_fd = accept(server_fd, (struct sockaddr*)&new_addr, &addrlen);
                if (new_fd >= 0) {
                    printf("Accepted a new connection with fd: %d\n", new_fd);
                    for (i=0;i < MAX_CONNECTIONS;i++) {
                        if (all_connections[i] < 0) {
                            all_connections[i] = new_fd;
                            break;
                        }
                    }
                } else {
                    fprintf(stderr, "accept failed [%s]\n", strerror(errno));
                }
                ret_val--;
                if (!ret_val) continue;
            }

            /* Check if the fd with event is a non-server fd */
            for (i=1;i < MAX_CONNECTIONS;i++) {
		    bytesRead = 0;
                if ((all_connections[i] > 0) &&
                    (FD_ISSET(all_connections[i], &read_fd_set))) {
                    /* read incoming data */
                    printf("Returned fd is %d [index, i: %d]\n", all_connections[i], i);
                    ret_val = recv(all_connections[i], length, 8, 0);
                    len = atoi(length);
                    char buf[len+8];
		            memcpy(buf, length, 8);
		            bytesRead+=ret_val;

                    if (ret_val == 0) {
                        printf("Closing connection for fd:%d\n", all_connections[i]);
                        close(all_connections[i]);
                        all_connections[i] = -1; /* Connection is now closed */
                    }
                    if (ret_val > 0) {
                        printf("Successfully Length data (len %d bytes, fd: %d): %s\n", ret_val, all_connections[i], buf);
			            while(len != bytesRead-8) {
				            ret_val = recv(all_connections[i], buf+bytesRead, len-(bytesRead-8), 0);
				            if(ret_val <= 0) {
					            break;
				            }
				            else
					            bytesRead+=ret_val;
			            }
			            printf("Successfully Received data (len %d bytes, fd: %d): %s\n", bytesRead, all_connections[i], buf);
			            memcpy(buf+159, "R", 1);
                        write(all_connections[i], buf, bytesRead);
                        printf("Successfully Send data (len %d bytes, fd: %d): %s\n", bytesRead, all_connections[i], buf);
                    }
                    if (ret_val == -1) {
                        printf("recv() failed for fd: %d [%s]\n",
                            all_connections[i], strerror(errno));
                        break;
                    }
                }
                ret_val--;
                if (!ret_val) continue;
            } /* for-loop */
        } /* (ret_val >= 0) */
    } /* while(1) */

    /* Last step: Close all the sockets */
    for (i=0;i < MAX_CONNECTIONS;i++) {
        if (all_connections[i] > 0) {
            close(all_connections[i]);
        }
    }
    return 0;
}

C Socket Client

#include <stdio.h>
#include <errno.h>
#include <sys/select.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <netdb.h>

#define DATA_BUFFER "Mona Lisa was painted by Leonardo da Vinci"

int main () {
    struct sockaddr_in saddr;
    int fd, ret_val;
    struct hostent *local_host; /* need netdb.h for this */

    /* Step1: create a TCP socket */
    fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (fd == -1) {
        fprintf(stderr, "socket failed [%s]\n", strerror(errno));
        return -1;
    }
    printf("Created a socket with fd: %d\n", fd);

    /* Let us initialize the server address structure */
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(15000);
    local_host = gethostbyname("127.0.0.1");
    saddr.sin_addr = *((struct in_addr *)local_host->h_addr);

    /* Step2: connect to the TCP server socket */
    ret_val = connect(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in));
    if (ret_val == -1) {
        fprintf(stderr, "connect failed [%s]\n", strerror(errno));
        close(fd);
        return -1;
    }
    printf("The Socket is now connected...\n");

    /* Next step: send some data */
    ret_val = send(fd,DATA_BUFFER, sizeof(DATA_BUFFER), 0);
    printf("Successfully sent data (len %d bytes): %s\n",
    ret_val, DATA_BUFFER);

    /* read data */
    printf("Receive data start...\n");
    char buffer[5000];
    int bytesRead = 0, loopCount =0, lastTry, rtrn;
    fd_set readyToRead;

    struct timeval readWait;

    int localloop=0;
    readWait.tv_sec = 1;
    readWait.tv_usec = 0;

    while ( bytesRead != ret_val)
    {
        FD_ZERO(& readyToRead);
        FD_SET(fd,& readyToRead);

        rtrn = select(FD_SETSIZE,& readyToRead,(fd_set *)0,(fd_set *)0,&readWait);
        if (rtrn!=-1 && FD_ISSET (fd, &readyToRead))
        {
            lastTry = recv(fd, buffer, ret_val, 0);
            if(lastTry > 0)
            bytesRead += lastTry;
        }
        if ( rtrn < 0 )
        {
            printf("select() return -1\n");
        }
        else if( rtrn == 0 ) {
            printf("select() return 0, loopCount [%d]\n", loopCount);
            loopCount++;
        }
        if(loopCount == 10)
            break;
    }
    printf("Successfully recv data (len %d bytes): %s\n", bytesRead, buffer);
    
    /* Last step: close the socket */
    close(fd);
    return 0;
}
This page was generated by GitHub Pages.
Author. silentjini