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