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;
}






No comments:

Post a Comment