int main(int argc, char **argv) { int usemenu = parsecmdline(argc, argv);//./server port -i -n -l short unsigned int key[3]; key[0] = getpid(); key[1] = time(NULL); seed48(key); serverdata_type *s = readinput(inputfile, sdata);//read server.dat or saved-data to initiate dU* and p* pthread_t thread; if (usemenu) {int pthread_id = pthread_create(&thread, NULL, runmenu, (void *)s); //printf("pthread_id=%d\n",pthread_id); } int socket = bindsocket(port); //printf("socket=%d\n",socket); if (!usemenu) printf("No menu will be available\n"); initparameters(s); //printf("key = %d\n", s->key); // main loop - we read requests and complete transactions while (FOREVER_EVER_EVER) { //printf("entering loop\n"); processrequest(socket, s); //printf("finishing loop\n"); } return 0; }
int Socket::connect(struct sockaddr *sa, socklen_t salen) { if (bindsocket() == -1) return -1; if (!utp_sock) { utp_sock = UTP_Create(_SendToProc, this, sa, salen); UTP_SetCallbacks(utp_sock, &utp_funcs, this); } UTP_Connect(utp_sock); }
int Socket::listen() { if (bindsocket() == -1) return -1; }
void main(){ int sockfd,newfd; struct sockaddr_in myaddress; struct sockaddr_in clientaddress; int sin_size; sockfd = createsocket(PF_INET,SOCK_DGRAM,0); create(&myaddress,MYPORT,IP); bindsocket(sockfd,&myaddress); //create tld data struct resource records[20]; int recordslen = 0; records[recordslen++] = createresource("dns.auth.com","127.0.0.20",Q_A,3000); records[recordslen++] = createresource("athena.com","dns.auth.com",Q_NS,3000); records[recordslen++] = createresource("www.athena.com","dns.auth.com",Q_NS,3000); records[recordslen++] = createresource("mail.athena.com","dns.auth.com",Q_NS,3000); records[recordslen++] = createresource("facebook.com","dns.auth.com",Q_NS,3000); records[recordslen++] = createresource("www.facebook.com","dns.auth.com",Q_NS,3000); records[recordslen++] = createresource("mail.facebook.com","dns.auth.com",Q_NS,3000); records[recordslen++] = createresource("google.com","dns.auth.com",Q_NS,3600); records[recordslen++] = createresource("www.google.com","dns.auth.com",Q_NS,3600); records[recordslen++] = createresource("mail.google.com","dns.auth.com",Q_NS,3600); records[recordslen++] = createresource("amazon.com","dns.auth.com",Q_NS,3000); records[recordslen++] = createresource("www.amazon.com","dns.auth.com",Q_NS,3000); records[recordslen++] = createresource("mail.amazon.com","dns.auth.com",Q_NS,3000); while(1){ printf("\n\nWaiting for query.\n\n"); struct msg m; recievequery(sockfd,&m,&clientaddress); if(m.msg_type==MSG_QUERY){ printf("Query for %s recieved.\n", m.queries[0].name); struct resource found[4]; int k = search(records,recordslen,found,m.queries[0].name); if(k>0){ if(found[0].type == Q_NS){ //find dns printf("NS Record found.\n"); struct resource dns[4]; int l = search(records,recordslen,dns,found[0].value); if(k>0){ m.answers[0] = found[0]; m.answers[1] = dns[0]; sendquery(sockfd,m,MSG_REPLY,0,2,clientaddress); }else{ //no A records found for dns. Shouldn't happen normally. printf("But No A Records found.\n"); sendquery(sockfd,m,MSG_ERROR,0,0,clientaddress); } }else{ //possibly the A records printf("A Records found.\n"); int i; for (i = 0; i < k; i++) { m.answers[i] = found[i]; } sendquery(sockfd,m,MSG_REPLY,0,0,clientaddress); } }else{ //no results printf("No Records found.\n"); sendquery(sockfd,m,MSG_ERROR,0,0,clientaddress); } }else{ //error. printf("Not a query.\n"); sendquery(sockfd,m,MSG_ERROR,0,0,clientaddress); } } }