Tuesday, April 5, 2011

udp client server prog

//udp client
#include <stdlib.h> /* for exit() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h> /* memset() */
#include <sys/time.h> /* select() */
#define REMOTE_SERVER_PORT 1500
#define MAX_MSG 100

#define SOCKET_ERROR -1
int isReadable(int sd,int * error,int timeOut) { // milliseconds
  fd_set socketReadSet;
  FD_ZERO(&socketReadSet);
  FD_SET(sd,&socketReadSet);
  struct timeval tv;
  if (timeOut) {
    tv.tv_sec  = timeOut / 1000;
    tv.tv_usec = (timeOut % 1000) * 1000;
  } else {
    tv.tv_sec  = 0;
    tv.tv_usec = 0;
  } // if
  if (select(sd+1,&socketReadSet,0,0,&tv) == SOCKET_ERROR) {
    *error = 1;
    return 0;
  } // if
  *error = 0;
  return FD_ISSET(sd,&socketReadSet) != 0;
} /* isReadable */
/* END jcs 3/30/05 */
int main(int argc, char *argv[]) {
 
  int sd, rc, i, n, echoLen, flags, error, timeOut;
  struct sockaddr_in cliAddr, remoteServAddr, echoServAddr;
  struct hostent *h;
  char msg[MAX_MSG];

  /* check command line args */
  if(argc<3) {
    printf("usage : %s <server> <data1> ... <dataN> \n", argv[0]);
    exit(1);
  }
  /* get server IP address (no check if input is IP address or DNS name */
  h = gethostbyname(argv[1]);
  if(h==NULL) {
    printf("%s: unknown host '%s' \n", argv[0], argv[1]);
    exit(1);
  }
  printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name,
  inet_ntoa(*(struct in_addr *)h->h_addr_list[0]));
  remoteServAddr.sin_family = h->h_addrtype;
  memcpy((char *) &remoteServAddr.sin_addr.s_addr,
  h->h_addr_list[0], h->h_length);
  remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT);
  /* socket creation */
  sd = socket(AF_INET,SOCK_DGRAM,0);
  if(sd<0) {
    printf("%s: cannot open socket \n",argv[0]);
    exit(1);
  }
 
  /* bind any port */
  cliAddr.sin_family = AF_INET;
  cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  cliAddr.sin_port = htons(0);
 
  rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr));
  if(rc<0) {
    printf("%s: cannot bind port\n", argv[0]);
    exit(1);
  }
/* BEGIN jcs 3/30/05 */
  flags = 0;
  timeOut = 100; // ms
/* END jcs 3/30/05 */
  /* send data */
  for(i=2;i<argc;i++) {
    rc = sendto(sd, argv[i], strlen(argv[i])+1, flags,
  (struct sockaddr *) &remoteServAddr,
  sizeof(remoteServAddr));
    if(rc<0) {
      printf("%s: cannot send data %d \n",argv[0],i-1);
      close(sd);
      exit(1);
    }
/* BEGIN jcs 3/30/05 */
    /* init buffer */
    memset(msg,0x0,MAX_MSG);
    while (!isReadable(sd,&error,timeOut)) printf(".");
    printf("\n");
    /* receive echoed message */
    echoLen = sizeof(echoServAddr);
    n = recvfrom(sd, msg, MAX_MSG, flags,
      (struct sockaddr *) &echoServAddr, &echoLen);
    if(n<0) {
      printf("%s: cannot receive data \n",argv[0]);
      continue;
    }
    /* print received message */
    printf("%s: echo from %s:UDP%u : %s \n",
      argv[0],inet_ntoa(echoServAddr.sin_addr),
      ntohs(echoServAddr.sin_port),msg);
/* END jcs 3/30/05 */
  }
 
  return 1;
}


//udp server for echoing

/* fpont 12/99 */
/* pont.net    */
/* udpServer.c */
/* Converted to echo client/server with select() (timeout option). See udpClient.c */
/* 3/30/05 John Schultz */
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h> /* close() */
#include <string.h> /* memset() */
#define LOCAL_SERVER_PORT 1500
#define MAX_MSG 100
int main(int argc, char *argv[]) {
 
  int sd, rc, n, cliLen, flags;
  struct sockaddr_in cliAddr, servAddr;
  char msg[MAX_MSG];
  /* socket creation */
  sd=socket(AF_INET, SOCK_DGRAM, 0);
  if(sd<0) {
    printf("%s: cannot open socket \n",argv[0]);
    exit(1);
  }
  /* bind local server port */
  servAddr.sin_family = AF_INET;
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servAddr.sin_port = htons(LOCAL_SERVER_PORT);
  rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr));
  if(rc<0) {
    printf("%s: cannot bind port number %d \n",
    argv[0], LOCAL_SERVER_PORT);
    exit(1);
  }
  printf("%s: waiting for data on port UDP %u\n",
    argv[0],LOCAL_SERVER_PORT);
/* BEGIN jcs 3/30/05 */
  flags = 0;
/* END jcs 3/30/05 */
  /* server infinite loop */
  while(1) {
   
    /* init buffer */
    memset(msg,0x0,MAX_MSG);
    /* receive message */
    cliLen = sizeof(cliAddr);
    n = recvfrom(sd, msg, MAX_MSG, flags,
   (struct sockaddr *) &cliAddr, &cliLen);
    if(n<0) {
      printf("%s: cannot receive data \n",argv[0]);
      continue;
    }
     
    /* print received message */
    printf("%s: from %s:UDP%u : %s \n",
    argv[0],inet_ntoa(cliAddr.sin_addr),
    ntohs(cliAddr.sin_port),msg);
/* BEGIN jcs 3/30/05 */
    sleep(1);
    sendto(sd,msg,n,flags,(struct sockaddr *)&cliAddr,cliLen);
/* END jcs 3/30/05 */
   
  }/* end of server infinite loop */
return 0;
}







 

No comments:

Post a Comment