/* Datagram Server, by Dan Fraser */ #include #include #include #include #include #include #include #include #include #include #include "dbase.h" #define TRUE 1 int main(void) { int sock; /* socket handle */ int length; /* temporary length holder */ struct sockaddr_in server,remote; /* address structures */ char buf[1024]; /* i/o buffer */ char descript[501]; /* description buffer */ /* create a socket */ sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { printf("error opening stream socket.\n"); exit(1); } printf("socket opened.\n"); /* set up the address info */ server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port=0; /* bind the address to the socket */ if (bind(sock,(struct sockaddr*)&server, sizeof(server))) { printf("error binding stream socket.\n"); exit(1); } printf("socket bound.\n"); /* get the port number of the socket */ if (getsockname(sock, (struct sockaddr*) &server, &length)) { printf("error getting socket name.\n"); exit(1); } printf("got socket name.\n"); do { /* wait for a UDP packet */ printf("waiting for connection on port %d.\n",server.sin_port); if (recvfrom(sock,buf,sizeof(buf), 0, (struct sockaddr*)&remote,&length) < 0) { printf("error receiving datagram packet\n"); } else { /* we've got a packet, process it! */ printf("got packet from host %s port %d.\n",inet_ntoa(remote.sin_addr),remote.sin_port); printf("%s\n",buf); /* bounce a reply right back to the sender */ printf("sending reply: %s\n",outval(buf,descript)); sendto(sock,descript,strlen(descript),0,(struct sockaddr*)&remote,length); } } while (TRUE); close(sock); }