/* $Header: /users/server/students/cs522/project/sharedraw/RCS/is.c,v 1.2 1992/11/02 18:58:52 chow Exp $ */ /* receiver for internet datagram demo */ #include #include #include #include #include #include "Servermsg.h" #define ENDPACKET "end" struct sockaddr_in toUA; int numbReg = 0; struct hostent *hp, *gethostbyname(); struct RegistRecord regList[ 10 ]; help_msg() { printf("format: idgr\n"); } printmsg(msg, cc) char *msg; int cc; { int i; printf("Got Message:%s\n", msg); for (i= 0; ih_addr,&toUA.sin_addr,hp->h_length); toUA.sin_port=htons(port); }*/ int findUsername(char *name); void setTo_addr(char *name,int port); main(argc, argv) int argc; char *argv[]; { int quitflag = 1; /*index number*/ //int numbReg = 0; int indexReg; union Message msg ; //struct RegistRecord regList[ 10 ]; int sockTo; int sockFrom; // struct sockaddr_in toUA; struct sockaddr_in fromUA; //struct hostent *hp, *gethostbyname(); int n, i; char hostname[64]; extern char *optarg; extern int optind; int option_exist = 0; int c; int debug = 0; char rcv_name[64]; /* receiver's socket name */ int toPort_no; int length; int fromlen; /* create socket from which to read */ sockFrom = socket(AF_INET, SOCK_DGRAM, 0); if (sockFrom < 0) { perror("opening datagram socket"); exit(1); } /* create name structure with wildcard using INADDR_ANY */ fromUA.sin_family = AF_INET; fromUA.sin_addr.s_addr = INADDR_ANY; fromUA.sin_port = 0; /* port no. < 1024 IPPORT_RESERVED is for privillege process */ /* here just initialized it, it will be assigned value after call */ /* getsockname() */ if (bind(sockFrom, &fromUA, sizeof(struct sockaddr_in))) { perror("binding name to datagram socket"); exit(1); } length = sizeof(fromUA); if (getsockname(sockFrom, &fromUA, &length)) { perror("getting socket name"); exit(1); } /* Find assigned port value and print out. */ printf("socket has port #%d\n", ntohs(fromUA.sin_port)); /* create socket on which to sent */ sockTo = socket(AF_INET, SOCK_DGRAM, 0); if (sockTo < 0) { perror("opening datagram socket"); exit(1); } toUA.sin_family = AF_INET; toUA.sin_addr.s_addr = INADDR_ANY; toUA.sin_port = 0; /* without this line, SUN version was denied in bind() */ if (bind(sockTo, &toUA, sizeof(struct sockaddr_in))) { perror("binding name to datagram socket to"); exit(1); } /* receive message */ while (quitflag) { bzero(&(msg.regist.msgType),sizeof(msg)); n = recv(sockFrom, &(msg.regist.msgType), sizeof(msg), 0); if (n < 0) perror("receiving datagram message"); printf("number received=%d\n",n); printf("type=%d\n",msg.regist.msgType); switch(msg.regist.msgType){ case REG: numbReg++; strcpy( regList[numbReg].username,msg.regist.username); strcpy( regList[numbReg].userLogin,msg.regist.userLogin); strcpy( regList[numbReg].hostname,msg.regist.hostname); regList[numbReg].portId=msg.regist.portId ; printf("name=%s\n",msg.regist.username); printf("login=%s\n",msg.regist.userLogin); printf("host=%s\n",msg.regist.hostname); printf("port=%d\n",msg.regist.portId); /*form sending back msg*/ setTo_addr(msg.regist.hostname,msg.regist.portId); /*hp=gethostbyname(msg.regist.hostname); bcopy(hp->h_addr,&toUA.sin_addr,hp->h_length); toUA.sin_port=htons(msg.regist.portId);*/ msg.rack.msgType=RACK; strcpy(msg.rack.fromUsername,"hello"); strcpy(msg.rack.toUsername,"good"); printf("SENDING-------\n"); if (sendto(sockTo, &(msg.rack.msgType), sizeof(msg), 0, &toUA, sizeof(toUA)) < 0) perror("sending datagram message"); break; case CONN: printf("fromname=%s\n",msg.conn.fromUsername); printf("toname%s\n",msg.conn.toUsername); indexReg=findUsername(msg.conn.toUsername); printf("findindex=%d\n",indexReg); printf("regList[].host=%s\n",regList[indexReg].hostname); printf("reg[].port=%d\n",regList[indexReg].portId); if(indexReg>0) { msg.conn.msgType=CONN; setTo_addr(regList[indexReg].hostname,regList[indexReg].portId); if (sendto(sockTo,&(msg.conn.msgType),sizeof(msg),0,&toUA,sizeof(toUA))<0) perror("sending datagram message"); } else { printf("no user\n"); indexReg=findUsername(msg.conn.fromUsername); printf("findindex=%d\n",indexReg); printf("FROM regList[].host=%s\n",regList[indexReg].hostname); printf("reg[].port=%d\n",regList[indexReg].portId); if(indexReg>0){ setTo_addr(regList[indexReg].hostname,regList[indexReg].portId); msg.nak.msgType=NAK; strcpy(msg.nak.reason,"No such user registed"); if(sendto(sockTo,&(msg.nak.msgType),sizeof(msg),0,&toUA,sizeof(toUA))<0) perror("sending datagram message"); } } break; case CACK: msg.cack.msgType=CACK; indexReg=findUsername(msg.cack.fromUsername); if(indexReg>0){ strcpy(msg.cack.hostname,regList[indexReg].hostname); msg.cack.portId=regList[indexReg].portId; indexReg=findUsername(msg.cack.toUsername); if(indexReg>0){ setTo_addr(regList[indexReg].hostname,regList[indexReg].portId); if (sendto(sockTo,&(msg.cack.msgType),sizeof(msg),0,&toUA,sizeof(toUA))<0) perror("sending datagram message"); } } break; case NAK: msg.nak.msgType=NAK; strcpy(msg.nak.reason,"User refused"); indexReg=findUsername(msg.nak.toUsername); if(indexReg>0){ setTo_addr(regList[indexReg].hostname,regList[indexReg].portId); if (sendto(sockTo,&(msg.nak.msgType),sizeof(msg),0,&toUA,sizeof(toUA))<0) perror("sending datagram message"); } break; default: printf("typr=%d\n",msg.regist.msgType); } } close(sockFrom); close(sockTo); } int findUsername(char *name){ int index; for(index=1;index<=numbReg;index++){ if(strcmp(name,regList[index].username)==0) return index; } return 0; } void setTo_addr(char *name,int port){ hp=gethostbyname(name); bcopy(hp->h_addr,&toUA.sin_addr,hp->h_length); toUA.sin_port=htons(port); }