00001 #include <unistd.h>
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004 #include <string.h>
00005 #include <strings.h>
00006 #include <sys/socket.h>
00007 #include <sys/types.h>
00008 #include <netinet/in.h>
00009 #include <time.h>
00010 #include <signal.h>
00011 #include <mysql/mysql.h>
00012
00013 #define BUFFER 4096
00014 #define MSG_SIZE 200
00015 #define MAX_CLIENTS 95
00016 #define MYPORT 7400
00017
00018 void Read();
00019 void loginFn();
00020
00021 MYSQL *connection1;
00022 MYSQL_RES *result;
00023 MYSQL_ROW sqlrow;
00024
00025 int value=0,success=0;
00026 int fd;
00027 int num_clients = 0,id=0,FID[100];
00028 char SId[10],list[200];
00029 int listen_file_descriptor;
00030 int return1;
00031
00035 char fd_array[MAX_CLIENTS];
00036 char msg[MSG_SIZE + 1];
00037 char loginName[100],password[100],allNames[100][100];
00038 int friends[100],num=0,ONLINE[100],opened[100];
00039 int present;
00040
00041 char newMsg[200];
00042
00047 void close_properly(int signal)
00048 {
00049 printf("Shutting down...\n");
00050 mysql_close(connection1);
00051 exit(0);
00052 }
00053
00059 void exitClient(int fd, fd_set *readfds, char fd_array[], int *num_clients)
00060 {
00061 int i;
00062 close(fd);
00063 FD_CLR(fd, readfds);
00064 for (i = 0; i < (*num_clients) - 1; i++)
00065 if (fd_array[i] == fd)
00066 break;
00067 for (; i < (*num_clients) - 1; i++)
00068 {
00069 (fd_array[i]) = (fd_array[i + 1]);
00070 ONLINE[i]=ONLINE[i+1];
00071 }
00072
00073 (*num_clients)--;
00074
00075 }
00076
00077
00084 void display_row ()
00085 {
00086 unsigned int field_count;
00087 field_count = 0;
00088 if(strcmp(loginName,sqlrow[1])==0&&strcmp(password,sqlrow[3])==0)
00089 {
00090
00091 value=1;
00092 success=1;
00093 strcpy(SId,sqlrow[0]);
00094 }
00095 else if(strcmp(loginName,sqlrow[1])==0&&strcmp(password,sqlrow[3])!=0)
00096 {
00097
00098 value=1;
00099 success=0;
00100 }
00101 }
00102
00108 void connectToDB()
00109 {
00110
00111 connection1=mysql_init (NULL);
00112 if (mysql_real_connect (connection1, "localhost", "root", "sairamatulasi", "cs3002_database", 0, NULL, 0))
00113 {
00114
00115
00116 }
00117 else
00118 {
00119 fprintf (stderr, "Connection failed\n");
00120 if (mysql_errno (connection1))
00121 {
00122 fprintf (stderr, "Connection error %d: %s\n",
00123 mysql_errno (connection1),
00124 mysql_error (connection1));
00125 }
00126 exit(EXIT_FAILURE);
00127 }
00128 printf("\n connected to DB\n");
00129 fflush(stdout);
00130
00131 return ;
00132 }
00133
00139 void newFn()
00140 {
00141 int i,j,return_value;
00142 char query[200];
00143 i=0;
00144 j=0;
00145
00146 while(msg[i]!='&')
00147 {
00148 i++;
00149 }
00150 i=i+2;
00151 while(msg[i]!='\0')
00152 query[j++]=msg[i++];
00153 msg[0]='\0';
00154 query[j]='\0';
00155 return_value = mysql_query (connection1,query);
00156 if (return_value)
00157 {
00158
00159 if(strstr(mysql_error(connection1),"key 2")!=NULL)
00160 write(fd,"Login Name Exist",17);
00161 else
00162 write(fd,"insert failed",14);
00163 }
00164 else
00165 write(fd,"insert success",15);
00166 return;
00167 }
00168
00169
00175 void display_row2 ()
00176 {
00177 int i;
00178 for(i=0;i<num_clients-1;i++)
00179 {
00180 if(ONLINE[i]==atoi(sqlrow[1]))
00181 friends[num++]=atoi(sqlrow[1]);
00182 }
00183 }
00184
00189 void findFriends()
00190 {
00191 int return_value;
00192 char query[100];
00193
00194 sprintf(query,"select * from friends where myId=%d",id);
00195 return_value = mysql_query (connection1, query);
00196 if (return_value)
00197 {
00198 printf ("select failed as : %s\n", mysql_error (connection1));
00199 }
00200 else
00201 {
00202 result = mysql_use_result (connection1);
00203 if (result)
00204 {
00205 while ((sqlrow = mysql_fetch_row (result)))
00206 display_row2 ();
00207
00208 if (mysql_errno (connection1))
00209 {
00210 printf ("Error occurred while retrieving data : %s\n", mysql_error (connection1));
00211 }
00212 }
00213 mysql_free_result(result);
00214 }
00215
00216
00217 }
00218
00219 void display_row3 ()
00220 {
00221 strcat(list,sqlrow[1]);
00222 strcat(list,"^^");
00223 }
00224
00230 void sendMsg()
00231 {
00232 int i,return_value;
00233 char query[100];
00234 list[0]='\0';
00235 strcpy(list,"LIST^^");
00236 for(i=0;i<num;i++)
00237 {
00238 sprintf(query,"select * from Login where ID=%d",friends[i]);
00239 return_value = mysql_query (connection1, query);
00240 if (return_value)
00241 {
00242 printf ("select failed as : %s\n", mysql_error (connection1));
00243 }
00244 else
00245 {
00246 result = mysql_use_result (connection1);
00247 if (result)
00248 {
00249 while ((sqlrow = mysql_fetch_row (result)))
00250 display_row3 ();
00251
00252 if (mysql_errno (connection1))
00253 {
00254 printf ("Error occurred while retrieving data : %s\n", mysql_error (connection1));
00255 }
00256 }
00257 mysql_free_result(result);
00258 }
00259 }
00260 write(fd,list,MSG_SIZE-1);
00261 }
00262
00268 void loginFn()
00269 {
00270 int i,j,k,return_value;
00271 i=0;
00272 k=0;
00273 j=0;
00274 success=0;
00275 value=0;
00276
00277 fflush(stdout);
00278 while(msg[i]!='$')
00279 {
00280 i++;
00281 }
00282 i=i+2;
00283 fflush(stdout);
00284 while(msg[i]!='&')
00285 loginName[k++]=msg[i++];
00286 loginName[k]='\0';
00287 while(msg[i]=='&')
00288 i++;
00289 do
00290 {
00291 password[j++]=msg[i];
00292 i++;
00293 }
00294 while(i<strlen(msg));
00295 msg[0]='\0';
00296 password[j]='\0';
00297 return_value = mysql_query (connection1, "select * from Login");
00298 if (return_value)
00299 {
00300 printf ("select failed as : %s\n", mysql_error (connection1));
00301 }
00302 else
00303 {
00304 result = mysql_use_result (connection1);
00305 if (result)
00306 {
00307 while ((sqlrow = mysql_fetch_row (result)))
00308 display_row ();
00309
00310 if (mysql_errno (connection1))
00311 {
00312 printf ("Error occurred while retrieving data : %s\n", mysql_error (connection1));
00313 }
00314 }
00315 mysql_free_result(result);
00316 }
00317 if(value==1)
00318 {
00319 if(success==1)
00320 {
00321 sprintf(msg,"correct");
00322 id=atoi(SId);
00323 ONLINE[num_clients-1]=id;
00324 strcpy(allNames[num_clients-1],loginName);
00325 num=0;
00326 return_value = write(fd, msg, strlen(msg));
00327 findFriends();
00328 sendMsg();
00329 }
00330 else
00331 {
00332 sprintf(msg,"check");
00333 return_value = write(fd, msg, strlen(msg));
00334 close(fd_array[num_clients-1]);
00335 num_clients--;
00336 }
00337 }
00338 else
00339 {
00340
00341 sprintf(msg,"wrong");
00342 return_value = write(fd, msg, strlen(msg));
00343 close(fd_array[num_clients-1]);
00344 num_clients--;
00345
00346 }
00347
00348
00349
00350 if(return_value < 0)
00351 {
00352 perror("write() failed.");
00353 exit(1);
00354 }
00355
00356
00357
00358 }
00359
00365 void message(char *MSG)
00366 {
00367 int i,j,return_value;
00368 char *part;
00369 char query[100];
00370 char myname[100],fname[100],msg[200],DMSG[200],msg2[200];
00371 strcpy(DMSG,MSG);
00372 part=strtok(MSG,"##");
00373 part=strtok(NULL,"##");
00374 strcpy(myname,part);
00375 part=strtok(NULL,"##");
00376 strcpy(fname,part);
00377 part=strtok(NULL,"##");
00378 strcpy(msg,part);
00379 fflush(stdout);
00380 for(i=0;i<num_clients;i++)
00381 if(strcmp(allNames[i],fname)==0)
00382 write(fd_array[i],DMSG,strlen(DMSG));
00383
00384 for(i=0;i<num_clients;i++)
00385 if(strcmp(allNames[i],fname)==0)
00386 break;
00387
00388
00389 for(j=0;j<num_clients;j++)
00390 if(strcmp(allNames[j],myname)==0)
00391 break;
00392 sprintf(msg2,"%s:%s",myname,msg);
00393 sprintf(query,"insert into history values(%d,%d,'%s')",ONLINE[i],ONLINE[j],msg2);
00394 return_value = mysql_query (connection1,query );
00395 if (return_value)
00396 {
00397 printf ("select failed as : %s\n", mysql_error (connection1));
00398 }
00399
00400 query[0]='\0';
00401 sprintf(query,"insert into history values(%d,%d,'%s')",ONLINE[j],ONLINE[i],msg2);
00402 return_value = mysql_query (connection1,query );
00403 if (return_value)
00404 {
00405 printf ("select failed as : %s\n", mysql_error (connection1));
00406 }
00407
00408 }
00409
00410
00411
00412 void display_row4 (char fname[100])
00413 {
00414 int i;
00415 for(i=0;i<num_clients-1;i++)
00416 {
00417 if(strcmp(fname,sqlrow[1]))
00418 present=atoi(sqlrow[0]);
00419 }
00420 }
00421
00422
00423
00424 void display_row6 ()
00425 {
00426 strcat(newMsg,sqlrow[2]);
00427
00428 }
00429
00436 void photo(char *MSG)
00437 {
00438 int i,j;
00439 char *part;
00440 char myname[100],fname[100],DMSG[200];
00441 strcpy(DMSG,MSG);
00442
00443 part=strtok(MSG,"|||||");
00444 part=strtok(NULL,"|||||");
00445 strcpy(myname,part);
00446 part=strtok(NULL,"|||||");
00447 strcpy(fname,part);
00448
00449 for(i=0;i<num_clients;i++)
00450 if(strcmp(allNames[i],myname)==0)
00451 break;
00452 for(j=0;j<num_clients;j++)
00453 if(strcmp(allNames[j],fname)==0)
00454 break;
00455 part=strtok(NULL,"|||||");
00456 write(fd_array[j],DMSG,strlen(DMSG));
00457
00458 }
00459
00466 void startPhoto(char *MSG)
00467 {
00468 int i,j;
00469 char *part;
00470 char myname[100],fname[100],DMSG[200];
00471 DMSG[0]='\0';
00472 strcpy(DMSG,MSG);
00473 part=strtok(MSG,"|||||");
00474 part=strtok(NULL,"|||||");
00475 strcpy(myname,part);
00476 part=strtok(NULL,"|||||");
00477 strcpy(fname,part);
00478
00479 for(i=0;i<num_clients;i++)
00480 if(strcmp(allNames[i],myname)==0)
00481 break;
00482 for(j=0;j<num_clients;j++)
00483 if(strcmp(allNames[j],fname)==0)
00484 break;
00485 write(fd_array[j],DMSG,strlen(DMSG));
00486 return;
00487 }
00488
00494 void history(char *MSG)
00495 {
00496 int i,j,return_value;
00497 char *part;
00498 char query[100];
00499 char myname[100],fname[100],DMSG[200];
00500 strcpy(DMSG,MSG);
00501 part=strtok(MSG,"!!!");
00502 part=strtok(NULL,"!!!");
00503 strcpy(myname,part);
00504 part=strtok(NULL,"!!!");
00505 strcpy(fname,part);
00506
00507 for(i=0;i<num_clients;i++)
00508 if(strcmp(allNames[i],myname)==0)
00509 break;
00510 for(j=0;j<num_clients;j++)
00511 if(strcmp(allNames[j],fname)==0)
00512 break;
00513 sprintf(query,"select * from history where (myId=%d AND FID=%d)",ONLINE[i],ONLINE[j]);
00514 printf("\n |%s|\n",query);
00515 return_value = mysql_query (connection1, query);
00516 if (return_value)
00517 {
00518 printf ("select failed as : %s\n", mysql_error (connection1));
00519 }
00520 else
00521 {
00522 strcpy(newMsg,"HISTORY***");
00523 result = mysql_use_result (connection1);
00524 if (result)
00525 {
00526 while ((sqlrow = mysql_fetch_row (result)))
00527 {
00528 display_row6();
00529 if(strlen(newMsg)>=190)
00530 {
00531 write(fd_array[i],newMsg,strlen(newMsg));
00532 usleep(500);
00533 strcpy(newMsg,"HISTORY***");
00534 }
00535 else
00536 strcat(newMsg,"***");
00537 }
00538
00539 strcat(newMsg,"OVER");
00540 write(fd_array[i],newMsg,strlen(newMsg));
00541 usleep(500);
00542 if (mysql_errno (connection1))
00543 {
00544 printf ("Error occurred while retrieving data : %s\n", mysql_error (connection1));
00545 }
00546 }
00547 mysql_free_result(result);
00548 }
00549
00550 }
00551
00558 void acceptPhoto(char *MSG)
00559 {
00560 int i,j;
00561 char *part;
00562 char myname[100],fname[100],DMSG[200];
00563 strcpy(DMSG,MSG);
00564
00565 part=strtok(MSG,"&&&&");
00566 part=strtok(NULL,"&&&&");
00567 strcpy(fname,part);
00568 part=strtok(NULL,"&&&&");
00569 strcpy(myname,part);
00570 for(i=0;i<num_clients;i++)
00571 if(strcmp(allNames[i],myname)==0)
00572 break;
00573 for(j=0;j<num_clients;j++)
00574 if(strcmp(allNames[j],fname)==0)
00575 break;
00576 write(fd_array[j],DMSG,strlen(DMSG));
00577 }
00578
00584 void reject(char *MSG)
00585 {
00586 int i,j;
00587 char *part;
00588 char myname[100],fname[100],DMSG[200];
00589 strcpy(DMSG,MSG);
00590
00591 part=strtok(MSG,"&&&&");
00592 part=strtok(NULL,"&&&&");
00593 strcpy(fname,part);
00594 part=strtok(NULL,"&&&&");
00595 strcpy(myname,part);
00596 for(i=0;i<num_clients;i++)
00597 if(strcmp(allNames[i],myname)==0)
00598 break;
00599 for(j=0;j<num_clients;j++)
00600 if(strcmp(allNames[j],fname)==0)
00601 break;
00602 write(fd_array[j],DMSG,strlen(DMSG));
00603 }
00604
00614 int main(int argc, char *argv[])
00615 {
00616
00617 int i=0,j=0;
00618 int port;
00619
00620 int server_sockfd, client_sockfd;
00621 struct sockaddr_in server_address;
00622 int addresslen = sizeof(struct sockaddr_in);
00623
00624 fd_set readfds, testfds;
00625 char kb_msg[MSG_SIZE + 10];
00626 char statement[200];
00627
00628
00629 int result;
00630
00631 connectToDB();
00632
00633 if(argc!=3)
00634 {
00635 printf("Invalid parameter.\nUsage:./2Server -p portNumber\n");
00636 exit(0);
00637 }
00638 if(argc==1 || argc == 3)
00639 {
00640 if(argc==3)
00641 {
00642 if(!strcmp("-p",argv[1]))
00643 {
00644 sscanf(argv[2],"%i",&port);
00645 }
00646 else
00647 {
00648 printf("Invalid parameter.\nUsage: chat [-p PORT] HOSTNAME\n");
00649 exit(0);
00650 }
00651 }
00652 else
00653 port=MYPORT;
00654 printf("\n*** Server program starting (enter \"quit\" to stop): \n");
00655 fflush(stdout);
00656
00657
00658 server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
00659 bzero(&server_address, sizeof(server_address));
00660 server_address.sin_family = AF_INET;
00661 server_address.sin_addr.s_addr = htonl(INADDR_ANY);
00662 server_address.sin_port = htons(port);
00663 bind(server_sockfd, (struct sockaddr *)&server_address, addresslen);
00664
00665
00666
00667
00668 listen(server_sockfd, 1);
00669
00670
00671
00672 FD_ZERO(&readfds);
00673 FD_SET(server_sockfd, &readfds);
00674 FD_SET(0, &readfds);
00675
00676
00677
00678 struct sigaction act1;
00679
00680 act1.sa_handler = close_properly;
00681 sigemptyset(&act1.sa_mask);
00682 act1.sa_flags=0;
00683 sigaction(SIGINT, &act1, 0);
00684
00685
00686 while (1)
00687 {
00688 testfds = readfds;
00689 select(FD_SETSIZE, &testfds, NULL, NULL, NULL);
00690
00691
00692 for (fd = 0; fd < FD_SETSIZE; fd++)
00693 {
00694 if (FD_ISSET(fd, &testfds))
00695 {
00696
00697 if (fd == server_sockfd)
00698 {
00699 client_sockfd = accept(server_sockfd, NULL, NULL);
00700
00701 if (num_clients < MAX_CLIENTS)
00702 {
00703 FD_SET(client_sockfd, &readfds);
00704 fd_array[num_clients]=client_sockfd;
00705
00706 printf("\n Client %d joined\n",num_clients++);
00707 fflush(stdout);
00708
00709
00710 }
00711 else
00712 {
00713 sprintf(msg, "XSorry, too many clients. Try again later.\n");
00714 write(client_sockfd, msg, strlen(msg));
00715 close(client_sockfd);
00716 }
00717 }
00718 else if (fd == 0)
00719 {
00720
00721 fgets(kb_msg, MSG_SIZE + 1, stdin);
00722
00723 if (strcmp(kb_msg, "quit\n")==0)
00724 {
00725 sprintf(msg, "XServer is shutting down.\n");
00726 for (i = 0; i < num_clients ; i++)
00727 {
00728 write(fd_array[i], msg, strlen(msg));
00729 close(fd_array[i]);
00730 }
00731 for(i=0;i<num_clients;i++)
00732 close(fd_array[i]);
00733 close(server_sockfd);
00734 mysql_close(connection1);
00735 exit(0);
00736 }
00737 else
00738 {
00739
00740 sprintf(msg, "M%s", kb_msg);
00741 for (i = 0; i < num_clients ; i++)
00742 write(fd_array[i], msg, strlen(msg));
00743 }
00744 }
00745 else if(fd)
00746 {
00747
00748
00749 msg[0]='\0';
00750 memset(msg,MSG_SIZE,0);
00751 result = read(fd, msg, MSG_SIZE);
00752
00753 if(result==-1) perror(" error in read()");
00754
00755 else if(result>0)
00756 {
00757 msg[result]='\0';
00758 if(strstr(msg, "LOGIN")!=NULL)
00759 {
00760
00761
00762 loginFn();
00763 for(i=0;i<num_clients;i++)
00764 {
00765 for(j=0;j<num;j++)
00766 if(friends[j]==ONLINE[i])
00767 {
00768
00769 sprintf(statement,"Friend-Client ^^%d joined with &&%s",ONLINE[i],loginName);
00770 write(fd_array[i],statement,strlen(statement));
00771 }
00772 }
00773 }
00774 else if(strstr(msg, "NEWUSER")!=NULL)
00775 {
00776 newFn();
00777 }
00778 else if(strstr(msg, "MSG")!=NULL)
00779 {
00780
00781 message(msg);
00782 }
00783 else if(strstr(msg, "HISTORY")!=NULL)
00784 {
00785
00786 history(msg);
00787 }
00788 else if(strstr(msg, "STARTPHT")!=NULL)
00789 {
00790
00791 startPhoto(msg);
00792 }
00793 else if(strstr(msg, "PHOTO")!=NULL)
00794 {
00795
00796 photo(msg);
00797 }
00798 else
00799 {
00800
00801
00802 for(i=0;i<num_clients;i++)
00803 {
00804 if (fd_array[i] != fd)
00805 write(fd_array[i],msg,strlen(msg));
00806 }
00807 if(msg[0] == 'X')
00808 {
00809 exitClient(fd,&readfds, fd_array,&num_clients);
00810 }
00811
00812 }
00813 }
00814 }
00815 else
00816 {
00817 exitClient(fd,&readfds, fd_array,&num_clients);
00818 }
00819 }
00820 }
00821 }
00822 }
00823 return 0;
00824 }
00825