Client and Server Interaction with UDP
UDP (User Datagram Protocol)
- It uses a simple connectionless communication
- provides checksums for data integrity
- Port numbers for addressing different functions at the source and destination of the datagram.
- There is no guarantee of delivery, ordering, or duplicate protection.
- 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)
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)
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.
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 <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>
#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];
{
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 : ");
}
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);
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
// 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
{
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);
}
{
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
{
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);
}
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);
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 <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>
#include <errno.h>
void *thread_receiver(void *sock)
{
int valread = 0;
char buffer[1024];
socklen_t addr_size = 0;
struct sockaddr_in serv_addr;
{
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
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;
{
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;
}
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]);
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));
}
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;
}
}