/* EE450 Socket Programming Project, Spring 2007 **************************************************************************** ** File: content_provider.cpp ** Written by: Chin-Kai Chang ** Date: 04/21/2007 ** Purpose: ** ****************************************************************************/ //#include "content_provider.h" #include #include #include #include #include #include #include #include #include #include "StringTokenizer.h" using namespace std; #define SERVERPORT 3081 // the port users will be connecting to #define UDP_PORT1 4181 #define UDP_PORT2 4281 #define BUF_SIZE 100 #define TEMP_BUF_SIZE 100 #define MAXBUFLEN 100 #define MAXDATASIZE 100 char* ProviderName[2] = {"provider1","provider2"}; int providerID=0; char OutBuf1[TEMP_BUF_SIZE]; char OutBuf2[TEMP_BUF_SIZE]; char InBuf1[TEMP_BUF_SIZE]; char InBuf2[TEMP_BUF_SIZE]; class Cont{ private: int UDP_sockfd; int TCP_sockfd; struct sockaddr_in cont_UDP_addr; // connect to server struct sockaddr_in cont_TCP_addr;// struct sockaddr_in boot_addr; struct sockaddr_in boot_addr2; struct hostent *he; int numbytes; socklen_t addr_len; FILE *fp; char peerName[5]; void strcatName(void){memset(OutBuf1, '\0',TEMP_BUF_SIZE);strcat(OutBuf1,ProviderName[providerID]);} public: Cont(){ addr_len = sizeof(struct sockaddr); void connect(void); void login(void); }; } void Cont::connect(void){ /* get the host info */ if ((he=gethostbyname("localhost")) == NULL) { perror("gethostbyname"); exit(1); } /* fork 2 providers*/ if( fork() == 0 ) providerID++; /* open the UDP*/ if ((UDP_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { cerr<<"UDPsocket"; exit(1); } /* create a UDP socket and bind a dedicated port*/ cont_UDP_addr.sin_family = AF_INET; // host byte order cont_UDP_addr.sin_port = htons(UDP_PORT(providerID)); // short, network byte order cont_UDP_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP memset(&(cont_UDP_addr.sin_zero), '\0', 8); // zero the rest of the struct if (bind(UDP_sockfd, (struct sockaddr *)&my_UDP_addr,sizeof(struct sockaddr)) == -1) { cerr<<"Bind Error"; exit(1); } boot_addr.sin_family = AF_INET; // host byte order boot_addr.sin_port = htons(SERVERPORT); // short, network byte order boot_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(boot_addr.sin_zero), '\0', 8); // zero the rest of the struct }//End connect void Cont::login(void){ /* Try to send the registration data*/ /*provider name*/ memset(OutBuf1, '\0',TEMP_BUF_SIZE); strcat(OutBuf1,ProviderName[providerID]); strcat(OutBuf1," provider spring07"); /*send the registration data*/ if ((numbytes = sendto(UDP_sockfd, OutBuf1, strlen(OutBuf1), 0, (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) { perror("sendto"); exit(1); } } //Get file name and return the file pointer FILE* Cont::fetchFileName(void){ //Fetch file from boot server via UDP if ((numbytes = recvfrom(UDP_sockfd, InBuf1, MAXBUFLEN-1 , 0, (struct sockaddr *)&boot_addr2, &addr_len)) == -1) { perror("recvfrom"); exit(1); } InBuf1[numbytes] = '\0'; string tempStr = InBuf1; StringTokenizer strtok = StringTokenizer(tempStr," "); /*Open the file*/ File *fpt = fopen(strtok.elementAt(1), "r"); if(!fpt) cerr<<"open error"; fseek(fpt,0,SEEK_SET); return fpt } void Cont::start() { connect(); login(); fp = fetchFileName(); }