Friday, 5 January 2018

Client and Server Interaction with UDP


Client and Server Interaction with UDP

UDP (User Datagram Protocol)

  1. It uses a simple connectionless communication
  2. provides checksums for data integrity
  3. Port numbers for addressing different functions at the source and destination of the datagram.
  4. There is no guarantee of delivery, ordering, or duplicate protection.
  5. UDP avoids the overhead of such processing in the protocol stack

Real Time example:

TCP:
        World Wide Web(HTTP)
        E-mail (SMTP TCP)
        File Transfer Protocol (FTP)
        Secure Shell (SSH)
UDP:
         Domain Name System (DNS)
         Streaming media applications such as movies
         Online multiplayer games
         Voice over IP (VoIP)
         Trivial File Transfer Protocol (TFTP)

Real Time Applications for TCP:

Email:
       Reason: suppose if some packet(words/statement) is missing we cannot understand the content.It should be reliable.

Real Time Application for UDP:

video streaming:
        * **Reason: ***suppose if some packet(frame/sequence) is missing we can understand the content.Because video is collection of frames.For 1 second video there should be 25 frames(image).Even though we can understand some frames are missing due to our imagination skills. Thats why UDP is used for video streaming.

Example UDP server Program:

// Server side C/C++ program to demonstrate Socket programming
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8000

#include <pthread.h>
#include <errno.h>
#include <sys/ioctl.h>

struct sockaddr_in address;

void *thread_receiver(void *sock)
{
    int valread = 0;
    char buffer[1024];
    socklen_t addr_size = 0;
    struct sockaddr_in serv_addr;
    //char *cli_addr;
    char cli_addr[INET_ADDRSTRLEN];

    addr_size = sizeof(address);
    while(1) {
        memset(buffer,0, sizeof(buffer));
        if((valread = recvfrom((*(int *)sock), buffer, 1024, 0, (struct sockaddr *)&address,&addr_size)) < 0 ) {
            perror("Error in receiving : ");
        }

        *cli_addr = inet_ntoa(address.sin_addr);
        inet_ntop(AF_INET, &address.sin_addr, cli_addr, INET_ADDRSTRLEN);
        printf("Client details = %s \n",cli_addr);

#if 0
        // zero indicates end of file
        if(valread == 0) {
            printf("\n\n The client process is terminated so closing the connection \n");
            exit(0);
        }
#endif

        printf("\nVel Server received no of bytes = (%d) Data = (%s) errno = %d\n", valread, buffer, errno);
    }

    return NULL;
}

int main(int argc, char const *argv[])
{
    int server_fd;
//    int opt = 1;
    char buffer[1024] = {0};
    char *hello = "Hello from server";
    pthread_t thread_id;
    int nMode = 0; // 0: BLOCKING

    if(argc < 2)
    {
        printf("\nUsage: %s <port>\n", argv[0]);
        printf("Port is the server listining port number\n");
        exit(1);
    }


    // Creating socket file descriptor
    if ((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) == 0)
    {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    if (ioctl(server_fd, FIONBIO, &nMode) == -1)
    {
        close(server_fd);
        return  1;
    }
#if 0
    // Forcefully attaching socket to the port 8080
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
                &opt, sizeof(opt)))
    {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
#endif


    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY; //inet_addr("127.0.0.1");;
    address.sin_port = htons( atoi(argv[1]));

    if (bind(server_fd, (struct sockaddr *)&address,
                sizeof(address))<0)
    {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    pthread_create(&thread_id, NULL, thread_receiver, (void *)&server_fd);

    while(1) {
        printf("Enter the string to send to Client:");
        scanf("%s",buffer);

        sendto(server_fd, buffer, strlen(buffer) , 0, (struct sockaddr *)&address, sizeof(address));
    }

    return 0;
}

Example UDP Client Program:

// Client side C/C++ program to demonstrate Socket programming
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
// FTP 20 & 21, HTTP = 80,
#define PORT 8000

#include <pthread.h>
#include <errno.h>
void *thread_receiver(void *sock)
{
    int valread = 0;
    char buffer[1024];
    socklen_t addr_size = 0;
    struct sockaddr_in serv_addr;

    addr_size = sizeof(serv_addr);
    while(1) {
        memset(buffer,0, sizeof(buffer));
        if((valread = recvfrom((*(int *)sock), buffer, 1024, 0, (struct sockaddr *)&serv_addr,&addr_size)) < 0 ) {
            perror("Error in receiving : ");
        }
#if 0
        // zero indicates end of file
        if(valread == 0) {
            printf("\n\n The server process is terminated so closing the connection \n");
            exit(0);
        }
#endif

        printf("\nVel Client Received no of byte = (%d) data = (%s) err= %d\n", valread, buffer, errno );

    }

    return NULL;
}

int main(int argc, char const *argv[])
{
    struct sockaddr_in address;
    int sock = 0, valread;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[1024] = {0};
    pthread_t thread_id;


    if(argc < 3)
    {
        printf("\nUsage: %s <dstaddress> <port>\n", argv[0]);
        printf("- dstaddress is the target UDP server IP\n");
         printf("- port is the server listining port number\n");
        exit(1);
    }

    // Creating socket file descriptor
    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        printf("\n Socket creation error \n");
        return -1;
    }


    printf("Vel argv= %s %s argc= %d  \n", argv[0], argv[1], argc);
    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[2]));
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);


    pthread_create(&thread_id, NULL, thread_receiver, (void *)&sock);

    while(1) {
        printf("Enter the string to send to Server:");
        scanf("%s",buffer);
        sendto(sock, buffer, strlen(buffer) , 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
    }

    return 0;
}






Client and Server Interaction with TCP

TCP (Transmission Control Protocol)


  1. TCP is a connection-oriented protocol.
  2. The connection is established and maintained until the application programs at each end have finished exchanging messages.
  3. TCP is a transport layer protocol used by applications that require guaranteed delivery.
  4. It is a sliding window protocol that provides handling for both timeouts and retransmissions.
  5. TCP establishes a full duplex virtual connection between two endpoints.
  6. Each endpoint is defined by an IP address and a TCP port number.

Example TCP Server program:

// Server side C/C++ program to demonstrate Socket programming
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8080

#include <pthread.h>
#include <errno.h>

void *thread_receiver(void *new_socket)
{
    int valread = 0;
    char buffer[1024];

    while(1) {
        memset(buffer,0, sizeof(buffer));
        if((valread = read( (*(int *)new_socket), buffer, 1024)) < 0) {
            perror("Error in receiving : ");
        }

        // zero indicates end of file
        if(valread == 0) {
            printf("\n\n The client process is terminated so closing the connection \n");
            exit(0);
        }

        printf("\nVel Server received no of bytes = (%d) Data = (%s) errno = %d\n", valread, buffer, errno);
    }

    return NULL;
}

int main(int argc, char const *argv[])
{
    int server_fd, new_socket, valread;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    char *hello = "Hello from server";
    pthread_t thread_id;

    if(argc < 2)
    {
        printf("\nUsage: %s <port>\n", argv[0]);
        printf("Port is the server listining port number\n");
        exit(1);
    }

    // Creating socket file descriptor
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
    {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // Forcefully attaching socket to the port 8080
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
                &opt, sizeof(opt)))
    {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons( atoi(argv[1]));

    // Forcefully attaching socket to the port 8080
    if (bind(server_fd, (struct sockaddr *)&address,
                sizeof(address))<0)
    {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    if (listen(server_fd, 3) < 0)
    {
        perror("listen");
        exit(EXIT_FAILURE);
    }
    printf("Vel: Waiting for Client to connect:\n");
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
                    (socklen_t*)&addrlen))<0)
    {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    printf("Vel: Got the request from Client & connected to the client:  \n");

    pthread_create(&thread_id, NULL, thread_receiver, (void *)&new_socket);

    while(1) {
        memset(buffer,0,sizeof(buffer));

        printf("Enter the string to send to Client:");
        scanf("%s",buffer);
        if(send(new_socket , buffer, strlen(buffer) , 0 )<0) {
            perror("Error in sending : \n");
        }
    }

    return 0;
}

Example TCP Client program:

/ Client side C/C++ program to demonstrate Socket programming
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8080

#include <pthread.h>
#include <errno.h>

void *thread_receiver(void *sock)
{
    int valread = 0;
    char buffer[1024];

    while(1) {
        memset(buffer,0, sizeof(buffer));
        if((valread = read( (*(int *)sock), buffer, 1024)) < 0 ) {
            perror("Error in receiving : ");
        }
        // zero indicates end of file
        if(valread == 0) {
            printf("\n\n The server process is terminated so closing the connection \n");
            exit(0);
        }

        printf("\nVel Client Received no of byte = (%d) data = (%s) err= %d\n", valread, buffer, errno );

    }

    return NULL;
}

int main(int argc, char const *argv[])
{
    struct sockaddr_in address;
    int sock = 0, valread;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[1024] = {0};
    pthread_t thread_id;

    if(argc < 3)
    {
        printf("\nUsage: %s <dstaddress> <port>\n", argv[0]);
        printf("- dstaddress is the target tcp server IP\n");
        printf("- port is the server listining port number\n");
        exit(1);
    }

    // Creating socket file descriptor
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Socket creation error \n");
        return -1;
    }

    memset(&serv_addr, '0', sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[2]));

    // Convert IPv4 and IPv6 addresses from text to binary form
    if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
    {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("\nConnection Failed \n");
        return -1;
    }

    pthread_create(&thread_id, NULL, thread_receiver, (void *)&sock);
    while(1) {
        printf("Enter the string to send to Server:");
        scanf("%s",buffer);
        send(sock, buffer, strlen(buffer) , 0 );
    }

    return 0;
}


What is a socket

What is a socket ?

  1. Sockets allow communication between two different processes on the same or different machines.
  2. It’s talk to other computers using standard Unix file descriptors.
  3. A file descriptor is just an integer associated with an open file and it can be a network connection, a text file, a terminal, or something else.
  4. Used in a client-server application framework.
  5. Most of the application-level protocols like FTP, SMTP, and POP3 make use of sockets to establish connection between client and server and then for exchanging data.


Socket Types:

  1. SOCK_STREAM - Provides sequenced, reliable, two-way, connection-based byte streams.
  2. SOCK_DGRAM   - Supports datagrams (connectionless, unreliable messages of a fixed maximum length).
  3. SOCK_RAW        -  Provides raw network protocol access. These provide users access to the underlying communication protocols, which support socket abstractions
  4. SOCK_SEQPACKET  -