#include #include #include #include /***********************************************************************/ #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); }