Advertisement
Guest User

Untitled

a guest
May 30th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.47 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdbool.h>
  3. #include<stdlib.h>
  4. #include<sys/socket.h>
  5. #include<netinet/in.h>
  6. #include<unistd.h>
  7. #include<string.h>
  8. #include<netdb.h>
  9. #include<errno.h>
  10. #include<arpa/inet.h>
  11. #include<fcntl.h>
  12.  
  13. void clearString(char *s, size_t length);
  14. int hostname_to_ip(char * , char *);
  15. int recv_timeout(int s , int timeout);
  16.  
  17. int main()
  18. {
  19. FILE *fp;
  20. int comsocket,datasocket,cport,code, error;
  21. char rcvmsg[100],rcvdata[100], address[50], data_address[15], user[25], password[50], buffer[50], command[80], cmd[20], param1[30], hostname[50], a1[3],a2[3],a3[3],a4[3],p1[5],p2[5], tmp[100];
  22. char* token;
  23. char* stringp;
  24. struct sockaddr_in servaddr, dataaddr;
  25.  
  26. printf("Welcome to Simple FTP Client by Krzysztof Czajkowski and Damian Walony\n");
  27. printf("Use the \'help\' command for list of available commands\n");
  28.  
  29. while(true)
  30. {
  31. clearString(command, 80);
  32. clearString(rcvmsg, 100);
  33. clearString(rcvdata, 100);
  34. clearString(cmd, 20);
  35. scanf("%79s", command);
  36.  
  37. if (strcmp(command, "ls")==0)
  38. {
  39.  
  40. datasocket=socket(AF_INET,SOCK_STREAM,0);
  41. strcpy(cmd,"PASV");
  42. send(comsocket,cmd, sizeof(cmd),0);
  43.  
  44. recv(comsocket, rcvmsg, 100, 0);
  45. printf("%s\n", rcvmsg);
  46. sscanf(rcvmsg, "%d %*s %*s %*s %*c %s", &code, tmp); //teraz tmp zawiera informacje w postaci ip,ip,ip,ip,port1,port2)
  47.  
  48. //wyłuskiwanie adresu i portu z tmp
  49. stringp = tmp;
  50. token = strsep(&stringp, ",");
  51. strcpy(a1, token);
  52. token = strsep(&stringp, ",");
  53. strcpy(a2, token);
  54. token = strsep(&stringp, ",");
  55. strcpy(a3, token);
  56. token = strsep(&stringp, ",");
  57. strcpy(a4, token);
  58. token = strsep(&stringp, ",");
  59. strcpy(p1, token);
  60. token = strsep(&stringp, ",");
  61. strcpy(p2, token);
  62.  
  63. for(int i=0; i<5; i++)
  64. {
  65. if(p2[i]==')')
  66. p2[i]='\0';
  67. }
  68.  
  69. //kod 227 oznacza potwierdzenie przejścia w tryb pasywny
  70. if(code == 227)
  71. {
  72. strcpy(data_address,a1);
  73. sprintf(data_address, "%s.%s.%s.%s",a1,a2,a3,a4);
  74.  
  75. dataaddr.sin_family=AF_INET;
  76. dataaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  77. dataaddr.sin_port=htons(atoi(p1)*256+atoi(p2));
  78. dataaddr.sin_addr.s_addr = inet_addr(data_address);
  79. if(connect(datasocket,(struct sockaddr *)&dataaddr,sizeof(dataaddr))<0)
  80. {
  81. printf("Error in connection\n");
  82. exit(0);
  83. }
  84. //połączenie się powiodło
  85. else
  86. {
  87. printf("connected\n");
  88. clearString(cmd, 80);
  89. clearString(rcvmsg, 100);
  90. strcpy(cmd, "TYPE I"); //continuous mode
  91. send(comsocket,cmd, sizeof(cmd),0);
  92. while (recv(comsocket, rcvmsg, 100, MSG_DONTWAIT)>0)
  93. {
  94. printf("%s\n", rcvmsg);
  95. clearString(rcvmsg, 100);
  96. }
  97. clearString(cmd, 80);
  98. strcpy(cmd, "LIST");
  99. send(comsocket,cmd, sizeof(cmd),0);
  100. recv(comsocket, rcvmsg, 100, 0);
  101. printf("%s\n", rcvmsg);
  102.  
  103. clearString(buffer, 100);
  104. while (recv(datasocket, buffer, 100, 0)>0)
  105. {
  106. printf("%s", buffer);
  107. clearString(buffer, 100);
  108. }
  109. printf("\n");
  110.  
  111. clearString(rcvmsg, 100);
  112. while (recv(comsocket, rcvmsg, 100, MSG_DONTWAIT)>0)
  113. {
  114. printf("%s", rcvmsg);
  115. clearString(rcvmsg, 100);
  116. }
  117. printf("\n");
  118. }
  119. }
  120. else
  121. printf("error - unhandled code\n");
  122.  
  123.  
  124.  
  125. }
  126. else if (strcmp(command, "mkdir")==0)
  127. {
  128. printf("Specify name of directory to create: \n");
  129. scanf("%29s", param1);
  130. strcpy(cmd, "MKD ");
  131. strcat(cmd, param1);
  132. send(comsocket, cmd, sizeof(cmd), 0);
  133. recv(comsocket, rcvmsg, 100, 0);
  134. printf("%s\n", rcvmsg);
  135. }
  136. else if (strcmp(command, "rmdir")==0)
  137. {
  138. printf("Specify name of directory to remove: \n");
  139. clearString(param1, 30);
  140. scanf("%29s", param1);
  141. strcpy(cmd, "RMD ");
  142. strcat(cmd, param1);
  143. send(comsocket, cmd, sizeof(cmd), 0);
  144. recv(comsocket, rcvmsg, 100, 0);
  145. printf("%s\n", rcvmsg);
  146. }
  147. else if (strcmp(command, "cd")==0)
  148. {
  149. printf("Specify name of directory to switch to: \n");
  150. clearString(param1, 30);
  151. scanf("%29s", param1);
  152. strcpy(cmd, "CWD ");
  153. strcat(cmd, param1);
  154. send(comsocket, cmd, sizeof(cmd), 0);
  155. recv(comsocket, rcvmsg, 100, 0);
  156. printf("%s\n", rcvmsg);
  157. }
  158. else if (strcmp(command, "help")==0)
  159. {
  160. printf("List of available commands:\n");
  161. printf("login - enter username and password\n");
  162. printf("ls - list current directory\n");
  163. printf("mkdir - create directory\n");
  164. printf("rmdir - remove directory\n");
  165. printf("cd - change directory\n");
  166. printf("pwd - print current directory\n");
  167. printf("get - download file\n");
  168. printf("put - upload file\n");
  169. printf("close - terminate connection\n");
  170. printf("clear - clears the screen\n");
  171. printf("quit - close any open connections and terminate the program\n");
  172. }
  173. else if (strcmp(command, "pwd")==0)
  174. {
  175. strcpy(cmd, "PWD");
  176. send(comsocket, cmd, sizeof(cmd), 0);
  177. printf("PWD sent\n");
  178. recv(comsocket, rcvmsg, 100, 0);
  179. printf("%s\n", rcvmsg);
  180. }
  181. else if (strcmp(command, "get")==0)
  182. {
  183. datasocket=socket(AF_INET,SOCK_STREAM,0);
  184. strcpy(cmd,"PASV");
  185. send(comsocket,cmd, sizeof(cmd),0);
  186.  
  187. recv(comsocket, rcvmsg, 100, 0);
  188. printf("%s\n", rcvmsg);
  189. sscanf(rcvmsg, "%d %*s %*s %*s %*c %s", &code, tmp); //teraz tmp zawiera informacje w postaci (ip,ip,ip,ip,port1,port2)
  190.  
  191. //wyłuskiwanie adresu i portu z tmp
  192. stringp = tmp;
  193. token = strsep(&stringp, ",");
  194. strcpy(a1, token);
  195. token = strsep(&stringp, ",");
  196. strcpy(a2, token);
  197. token = strsep(&stringp, ",");
  198. strcpy(a3, token);
  199. token = strsep(&stringp, ",");
  200. strcpy(a4, token);
  201. token = strsep(&stringp, ",");
  202. strcpy(p1, token);
  203. token = strsep(&stringp, ",");
  204. strcpy(p2, token);
  205.  
  206. for(int i=0; i<5; i++)
  207. {
  208. if(p2[i]==')')
  209. p2[i]='\0';
  210. }
  211.  
  212. //kod 227 oznacza potwierdzenie przejścia w tryb pasywny
  213. if(code == 227)
  214. {
  215. strcpy(data_address,a1);
  216. sprintf(data_address, "%s.%s.%s.%s",a1,a2,a3,a4);
  217.  
  218. dataaddr.sin_family=AF_INET;
  219. dataaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  220. dataaddr.sin_port=htons(atoi(p1)*256+atoi(p2));
  221. dataaddr.sin_addr.s_addr = inet_addr(data_address);
  222. if(connect(datasocket,(struct sockaddr *)&dataaddr,sizeof(dataaddr))<0)
  223. {
  224. printf("Error in connection\n");
  225. exit(0);
  226. }
  227. //połączenie się powiodło
  228. else
  229. {
  230. printf("connected\n");
  231. clearString(cmd, 80);
  232. clearString(rcvmsg, 100);
  233. strcpy(cmd, "TYPE I"); //continuous mode
  234. send(comsocket,cmd, sizeof(cmd),0);
  235. while (recv(comsocket, rcvmsg, 100, MSG_DONTWAIT)>0)
  236. {
  237. printf("%s\n", rcvmsg);
  238. clearString(rcvmsg, 100);
  239. }
  240. clearString(cmd, 80);
  241. strcpy(cmd, "LIST");
  242. send(comsocket,cmd, sizeof(cmd),0);
  243. recv(comsocket, rcvmsg, 100, 0);
  244. printf("%s\n", rcvmsg);
  245.  
  246. clearString(buffer, 100);
  247. while (recv(datasocket, buffer, 100, 0)>0)
  248. {
  249. printf("%s", buffer);
  250. clearString(buffer, 100);
  251. }
  252. printf("\n");
  253.  
  254. clearString(rcvmsg, 100);
  255. while (recv(comsocket, rcvmsg, 100, MSG_DONTWAIT)>0)
  256. {
  257. printf("%s", rcvmsg);
  258. clearString(rcvmsg, 100);
  259. }
  260. printf("\n");
  261. }
  262. }
  263. else
  264. printf("error - unhandled code\n");
  265.  
  266. strcpy(cmd, "RETR");
  267. send(comsocket, cmd, sizeof(cmd), 0);
  268. recv(comsocket, rcvmsg, 100, 0);
  269. printf("%s\n", rcvmsg);
  270. }
  271. else if (strcmp(command, "put")==0)
  272. {
  273. datasocket=socket(AF_INET,SOCK_STREAM,0);
  274. strcpy(cmd,"PASV");
  275. send(comsocket,cmd, sizeof(cmd),0);
  276.  
  277. recv(comsocket, rcvmsg, 100, 0);
  278. printf("%s\n", rcvmsg);
  279. sscanf(rcvmsg, "%d %*s %*s %*s %*c %s", &code, tmp); //teraz tmp zawiera informacje w postaci (ip,ip,ip,ip,port1,port2)
  280.  
  281. //wyłuskiwanie adresu i portu z tmp
  282. stringp = tmp;
  283. token = strsep(&stringp, ",");
  284. strcpy(a1, token);
  285. token = strsep(&stringp, ",");
  286. strcpy(a2, token);
  287. token = strsep(&stringp, ",");
  288. strcpy(a3, token);
  289. token = strsep(&stringp, ",");
  290. strcpy(a4, token);
  291. token = strsep(&stringp, ",");
  292. strcpy(p1, token);
  293. token = strsep(&stringp, ",");
  294. strcpy(p2, token);
  295.  
  296. for(int i=0; i<5; i++)
  297. {
  298. if(p2[i]==')')
  299. p2[i]='\0';
  300. }
  301.  
  302. //kod 227 oznacza potwierdzenie przejścia w tryb pasywny
  303. if(code == 227)
  304. {
  305. strcpy(data_address,a1);
  306. sprintf(data_address, "%s.%s.%s.%s",a1,a2,a3,a4);
  307.  
  308. dataaddr.sin_family=AF_INET;
  309. dataaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  310. dataaddr.sin_port=htons(atoi(p1)*256+atoi(p2));
  311. dataaddr.sin_addr.s_addr = inet_addr(data_address);
  312. if(connect(datasocket,(struct sockaddr *)&dataaddr,sizeof(dataaddr))<0)
  313. {
  314. printf("Error in connection\n");
  315. exit(0);
  316. }
  317. //połączenie się powiodło
  318. else
  319. {
  320. printf("connected\n");
  321. clearString(cmd, 80);
  322. clearString(rcvmsg, 100);
  323. strcpy(cmd, "TYPE I"); //continuous mode
  324. send(comsocket,cmd, sizeof(cmd),0);
  325. while (recv(comsocket, rcvmsg, 100, MSG_DONTWAIT)>0)
  326. {
  327. printf("%s\n", rcvmsg);
  328. clearString(rcvmsg, 100);
  329. }
  330. clearString(cmd, 80);
  331. strcpy(cmd, "LIST");
  332. send(comsocket,cmd, sizeof(cmd),0);
  333. recv(comsocket, rcvmsg, 100, 0);
  334. printf("%s\n", rcvmsg);
  335.  
  336. clearString(buffer, 100);
  337. while (recv(datasocket, buffer, 100, 0)>0)
  338. {
  339. printf("%s", buffer);
  340. clearString(buffer, 100);
  341. }
  342. printf("\n");
  343.  
  344. clearString(rcvmsg, 100);
  345. while (recv(comsocket, rcvmsg, 100, MSG_DONTWAIT)>0)
  346. {
  347. printf("%s", rcvmsg);
  348. clearString(rcvmsg, 100);
  349. }
  350. printf("\n");
  351. }
  352. }
  353. else
  354. printf("error - unhandled code\n");
  355.  
  356. strcpy(cmd, "STOR");
  357. send(comsocket, cmd, sizeof(cmd), 0);
  358. recv(comsocket, rcvmsg, 100, 0);
  359. printf("%s\n", rcvmsg);
  360. }
  361. else if (strcmp(command, "close")==0)
  362. {
  363. clearString(buffer, 100);
  364. strcpy (buffer, "QUIT");
  365.  
  366. send(comsocket,buffer,sizeof(buffer),0);
  367. clearString(rcvmsg, 100);
  368. recv(comsocket, rcvmsg, 100, 0);
  369. printf("%s\n", rcvmsg);
  370. }
  371. else if (strcmp(command, "rm")==0)
  372. {
  373. printf("Specify name of file to remove: \n");
  374. clearString(param1, 30);
  375. scanf("%29s", param1);
  376. strcpy(cmd, "DELE");
  377. send(comsocket, cmd, sizeof(cmd), 0);
  378. recv(comsocket, rcvmsg, 100, 0);
  379. printf("%s\n", rcvmsg);
  380. }
  381. else if (strcmp(command, "clear")==0)
  382. {
  383. system("clear");
  384. }
  385. else if (strcmp(command, "login")==0)
  386. {
  387. printf("Enter host name: ");
  388. scanf("%49s", hostname);
  389. //strcpy(address, "70.42.74.46"); //uo server
  390. printf("Enter the port: ");
  391. scanf("%d",&cport);
  392. //cport = 21;
  393. comsocket=socket(AF_INET,SOCK_STREAM,0);
  394. if(comsocket<0)
  395. {
  396. printf("Error creating command socket\n");
  397. exit(1);
  398. }
  399. else
  400. printf("Socket is created\n");
  401.  
  402. hostname_to_ip(hostname, address);
  403.  
  404. servaddr.sin_family=AF_INET;
  405. servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  406. servaddr.sin_port=htons(cport);
  407. servaddr.sin_addr.s_addr = inet_addr(address);
  408.  
  409. if(connect(comsocket,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
  410. {
  411. printf("Error in connection\n");
  412. exit(1);
  413. }
  414. else
  415. printf("connected\n");
  416.  
  417. clearString(rcvmsg, 100);
  418. recv_timeout(comsocket, 4);
  419. // printf("%s", rcvmsg);
  420.  
  421. clearString(buffer, 100);
  422. printf("Login: ");
  423. scanf("%24s",user);
  424. strcpy(buffer, "USER ");
  425. strncat(buffer, user,sizeof(user));
  426. send(comsocket,buffer,sizeof(buffer),0 );
  427.  
  428. clearString(rcvmsg, 100);
  429. if (recv(comsocket, rcvmsg, 100, 0)>0) //sekcja dla serwerów nieanonimowych
  430. {
  431. printf("%s", rcvmsg);
  432.  
  433. clearString(buffer, 100);
  434. printf("Password: ");
  435. scanf("%49s",password);
  436. strcpy(buffer, "PASS ");
  437. strncat(buffer, password,sizeof(password));
  438. send(comsocket,buffer,sizeof(buffer),0);
  439. }
  440.  
  441. clearString(rcvmsg, 100);
  442. recv(comsocket, rcvmsg, 100, 0);
  443. printf("%s", rcvmsg);
  444. //tutaj klient juz jest zalogowany
  445. }
  446. else if (strcmp(command, "quit")==0)
  447. {
  448. clearString(buffer, 100);
  449. strcpy (buffer, "QUIT");
  450.  
  451. send(comsocket,buffer,sizeof(buffer),0);
  452. clearString(rcvmsg, 100);
  453. recv(comsocket, rcvmsg, 100, 0);
  454. printf("%s\n", rcvmsg);
  455. exit(0);
  456. }
  457. else
  458. {
  459. printf("error - unknown command, please try again\n");
  460. }
  461. }
  462.  
  463. }
  464.  
  465. //funkcja czyszcząca string s o długości length
  466. void clearString(char *s, size_t length)
  467. {
  468. memset(s, '\0', length);
  469. };
  470.  
  471. //funkcja zamieniająca hostname na adres IP
  472. int hostname_to_ip(char * hostname , char* ip)
  473. {
  474. struct hostent *he;
  475. struct in_addr **addr_list;
  476.  
  477. if ( (he = gethostbyname( hostname ) ) == NULL)
  478. {
  479. // get the host info
  480. herror("gethostbyname");
  481. return 1;
  482. }
  483.  
  484. addr_list = (struct in_addr **) he->h_addr_list;
  485.  
  486. for(int i = 0; addr_list[i] != NULL; i++)
  487. {
  488. strcpy(ip , inet_ntoa(*addr_list[i]) );
  489. return 0;
  490. }
  491.  
  492. return 1;
  493. }
  494.  
  495. int recv_timeout(int s , int timeout)
  496. {
  497. int size_recv , total_size= 0;
  498. struct timeval begin , now;
  499. char chunk[512];
  500. double timediff;
  501.  
  502. //make socket non blocking
  503. fcntl(s, F_SETFL, O_NONBLOCK);
  504.  
  505. //beginning time
  506. gettimeofday(&begin , NULL);
  507.  
  508. while(1)
  509. {
  510. gettimeofday(&now , NULL);
  511.  
  512. //time elapsed in seconds
  513. timediff = (now.tv_sec - begin.tv_sec) + 1e-6 * (now.tv_usec - begin.tv_usec);
  514.  
  515. //if you got some data, then break after timeout
  516. if( total_size > 0 && timediff > timeout )
  517. {
  518. break;
  519. }
  520.  
  521. //if you got no data at all, wait a little longer, twice the timeout
  522. else if( timediff > timeout*2)
  523. {
  524. break;
  525. }
  526.  
  527. memset(chunk ,0 , 512); //clear the variable
  528. if((size_recv = recv(s , chunk , 512 , 0) ) < 0)
  529. {
  530. //if nothing was received then we want to wait a little before trying again, 0.1 seconds
  531. usleep(100000);
  532. }
  533. else
  534. {
  535. total_size += size_recv;
  536. printf("%s" , chunk);
  537. //reset beginning time
  538. gettimeofday(&begin , NULL);
  539. }
  540. }
  541.  
  542. return total_size;
  543. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement