All pastes #52983 Raw Edit

Stuff

public text v1 · immutable
#52983 ·published 2006-05-02 21:28 UTC
rendered paste body
#include <sys/types.h>
#include <sys/socket.h>
#include <in.h>
#include <stdio.h>

/***********************************************************************/

#define MC (10) /* max number of udp connections served */
#define UDP_PKT_SZ (1024)

int udp_in_socket_id = -1;

int udp_in_socket    [MC];
int udp_in_pkt_count [MC];
int udp_in_server_on    [MC];
uchar_t udp_in_data[MC][UDP_PKT_SZ];

int udp_in_server(int udp_in_port, FUNCPTR udp_func) {
  struct sockaddr_in  serverAddr;    /* server's socket address */
  struct sockaddr_in  clientAddr;    /* client's socket address */
  int                 sockAddrSize;  /* size of socket address structure */
  int val;
  int optval;
  int sid;

  udp_in_socket_id++;

  if (udp_in_socket_id >= MC) {
    fprintf(stderr,"udp_in_server: no more serving can be done.\n");
    return(-1);
  }

  sid = udp_in_socket_id;

  /* set up the local address */
  sockAddrSize = sizeof (struct sockaddr_in);
  bzero ((char *) &serverAddr, sockAddrSize);
  serverAddr.sin_family = AF_INET;
  serverAddr.sin_port = htons(udp_in_port);
  serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

  /* create a UDP-based socket */
  if ((udp_in_socket[sid] = socket (AF_INET, SOCK_DGRAM, 0)) == ERROR)  {
    perror ("socket");
    return (ERROR);
  }
  /* allow reuse of socket - get port even if didn't previously close */
  /* doesn't seem to work!!! */
  optval = 1;
  if (setsockopt(udp_in_socket[sid], SOL_SOCKET, SO_REUSEADDR,
                  (char *) &optval, sizeof(int)) == ERROR) {
    perror("SO_REUSEADDR");
  }
  /* bind socket to local address */
  if (bind (udp_in_socket[sid],
            (struct sockaddr *) &serverAddr, sockAddrSize) == ERROR) {
    perror ("bind");
    close (udp_in_socket[sid]);
    return (ERROR);
  }

  udp_in_server_on[sid] = 1;
  udp_in_pkt_count[sid] = 0;

  while (udp_in_server_on[sid]) {
    /* receive UDP packet */
    val = recvfrom (udp_in_socket[sid],
                    (uchar_t *) &(udp_in_data[sid]), UDP_PKT_SZ, 0,
                    (struct sockaddr *) &clientAddr, &sockAddrSize);
    if (val == ERROR) {
      perror ("recvfrom");
      close (udp_in_socket[sid]);
      udp_in_server_on[sid] = 0;
      break;
    }
    udp_func((uchar_t *) &(udp_in_data[sid]), val);
  }

  fprintf(stderr,"udp_in_server[%d]: DONE.\n", sid);
  close(udp_in_socket[sid]);
  return(0);
}