Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.94 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<arpa/inet.h>
  3. #include<string.h>
  4. #include<sys/socket.h>
  5. #include<unistd.h>
  6. #include <stdlib.h>
  7. //--------------------------------------------------------------//
  8.  
  9. #define FRAGMENT_NUM 2
  10. #define CHECKSUM 6
  11. #define DATA 10
  12. #define ACK_TYPE 2
  13. #define KAP_TYPE 1
  14. #define MSG_TYPE 0
  15. #define MAX_TWO_CHARS 65535
  16. #define SERVER "127.0.0.1"
  17. #define MAX_FD 2
  18. #define STDIN 0
  19.  
  20. //--------------------------------------------------------------//
  21.  
  22.  
  23. typedef struct fragment{
  24. int current_number;
  25. u_char *data;
  26. struct fragment *next;
  27. struct fragment *prev;
  28. }Fragment;
  29.  
  30.  
  31. //--------------------------------------------------------------//
  32.  
  33. int debug = 1;
  34.  
  35. //-------------------------------------------------------------//
  36.  
  37. int get_size(u_char *datagram);
  38.  
  39. int type_of_packet(u_char *datagram);
  40.  
  41. int get_current_number(u_char *datagram);
  42.  
  43. int settings();
  44.  
  45. int crc32(u_char *datagram);
  46.  
  47. int open_socket();
  48.  
  49. int close_socket();
  50.  
  51. int send_kap();
  52.  
  53. int send_ack(int s, struct sockaddr_in *s_client, int slen);
  54.  
  55. int server(int port);
  56.  
  57. int client(int ip_address, int port, int *fragment_size);
  58.  
  59. int send_handshake(int s, int *size, struct sockaddr_in *s_client, int slen);
  60.  
  61. int recieve_handshake(int s, struct sockaddr_in *s_client, int slen, int *fragment_size);
  62.  
  63. void main_menu();
  64.  
  65. void print_s_menu();
  66.  
  67. void print_c_menu();
  68.  
  69. //--------------------------------------------------------------//
  70.  
  71.  
  72. int main (){
  73. int fragment_size;
  74. int port = 10002;
  75. // int role;
  76. // int ip_address;
  77. // Fragment *fragments;
  78. char control;
  79.  
  80.  
  81.  
  82. main_menu();
  83.  
  84. scanf("%c", &control);
  85. getchar();
  86. while(control != 'q'){
  87.  
  88. if (control == 's') if (server(port) == 1) printf("chyba");
  89.  
  90. if (control == 'c') {
  91. if (client(0, port, &fragment_size) == 1) printf("chyba");
  92.  
  93. }
  94.  
  95. main_menu();
  96. scanf("%c", &control);
  97. getchar();
  98. }
  99. printf("\n\tUkoncenie programu...\n");
  100. return 0;
  101. }
  102.  
  103. //--------------------------------------------------------------//
  104.  
  105.  
  106. int get_size(u_char *datagram){
  107.  
  108. int size = 0;
  109. size +=(int)datagram[0];
  110. size *= 256;
  111. size +=(int)datagram[1];
  112. return size;
  113. }
  114.  
  115. int type_of_packet(u_char *datagram){
  116.  
  117. if (get_size(datagram) == 0) return ACK_TYPE;
  118. if (get_size(datagram) == MAX_TWO_CHARS) return KAP_TYPE;
  119. return MSG_TYPE;
  120. }
  121.  
  122. int get_current_number(u_char *datagram){
  123. int num = 0;
  124. num =*(int*)(datagram[FRAGMENT_NUM]);
  125. return num;
  126. }
  127.  
  128. /*
  129. int settings(){
  130.  
  131. return 0;
  132. }
  133.  
  134.  
  135. int crc32(u_char *datagram){
  136.  
  137. return 0;
  138. }
  139.  
  140.  
  141. int open_socket(){
  142.  
  143. return 0;
  144. }
  145.  
  146.  
  147. int close_socket(){
  148.  
  149. return 0;
  150. }
  151.  
  152. int send_kap(){
  153.  
  154. return 0;
  155. }
  156.  
  157.  
  158. */
  159.  
  160. int server(int port){
  161.  
  162. struct sockaddr_in s_server, s_client;
  163. int sock, recv_len;
  164. int slen = sizeof(s_client);
  165. fd_set rset, fds;
  166. ssize_t n;
  167. struct timeval tv;
  168. u_char data[1500], buf[5], control;
  169. int buflen = 1500;
  170. int r;
  171. //int msg_len;
  172. int frag_size = 1000;
  173. // nastavenie UDP SOCKETU
  174. Fragment *last, *first, *cur;
  175.  
  176.  
  177. printf("Pouzivate program ako server\n");
  178.  
  179. if ((sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) return 1;
  180. // vynulovanie
  181. memset((char *) &s_server, 0, sizeof(s_server));
  182.  
  183. s_server.sin_family = AF_INET;
  184. s_server.sin_port = htons(port);
  185. s_server.sin_addr.s_addr = htonl(INADDR_ANY);
  186.  
  187. // bindovanie
  188. if (bind(sock , (struct sockaddr*)&s_server, sizeof(s_server)) == -1) return 1;
  189.  
  190. // pocuvanie
  191.  
  192. fflush(stdout);
  193. /*if ((recv_len = recvfrom(sock, data, buflen, 0, (struct sockaddr*)&s_client, &slen)) == -1){
  194. return 1;
  195. }*/
  196.  
  197.  
  198. //frag_size = get_size(data);
  199. print_s_menu();
  200.  
  201.  
  202.  
  203. while (control != 'q'){
  204. buf[0]= 'a';
  205. FD_ZERO(&fds);
  206. FD_SET(0, &fds);
  207. FD_SET(sock, &fds);
  208. rset = fds;
  209. tv.tv_sec = 2;
  210. tv.tv_usec = 0;
  211. select(sock+1, &rset, NULL, NULL, &tv);
  212.  
  213. if( FD_ISSET(STDIN, &rset)){
  214. // stdin
  215. r = read(0, buf, sizeof(buf));
  216. buf[r-1] = '0';
  217. if (buf[0] =='q') control = buf[0];
  218. if (buf[0]=='s') {
  219. fprintf(stdout," Velkost fragmentu je %d B\n", frag_size);
  220. }
  221. if (buf[0]=='h') print_s_menu();
  222.  
  223. }
  224.  
  225.  
  226. else if (FD_ISSET(sock, &rset)){
  227.  
  228. recieve_handshake(sock, &s_client, slen, &frag_size);
  229. send_handshake(sock, &frag_size, &s_client, slen);
  230. recvfrom(sock,buf, frag_size, 0, &s_client, slen);
  231. while (type_of_packet(buf) != ACK_TYPE){
  232. //crc
  233.  
  234. fprintf(stdout,"%s", qbuf+DATA);
  235. send_ack(sock, &s_client, slen);
  236. //parse_dgram(buf[DATA],last);
  237. recvfrom(sock,buf, frag_size, 0, &s_client, slen);
  238. }
  239.  
  240. cur = last;
  241. /* while (cur->prev != NULL)cur = cur->prev;
  242.  
  243. while (cur != NULL) {
  244. write(1, cur->data, frag_size);
  245. cur = cur->next;
  246. }*/
  247.  
  248. // write(1, data, recv_len+1);
  249. // send_ack(sock, buf, recv_len, &s_client, slen);
  250. }
  251. //else send_ack(sock, "ACK", 5, &s_client, slen);
  252. }
  253.  
  254.  
  255. printf("Ukoncili ste pracu servera\n");
  256. close(sock);
  257. return 0;
  258. }
  259.  
  260.  
  261. int client(int ip_address, int port, int *fragment_size){
  262.  
  263. struct sockaddr_in s_server;
  264. int sock;
  265. int handshake_control;
  266. int slen = sizeof(s_server);
  267. char buf[256];
  268. int buflen = 256;
  269. char control ='a';
  270. fd_set rset, fds;
  271. ssize_t n;
  272. struct timeval tv;
  273. printf("\nPouzivate program ako klient");
  274. *fragment_size = 2;
  275.  
  276. if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) return 1;
  277.  
  278. memset((char *) &s_server, 0, sizeof(s_server));
  279. s_server.sin_family = AF_INET;
  280. s_server.sin_port = htons(port);
  281.  
  282. if ( inet_aton(SERVER, &s_server.sin_addr) == 0 ) {
  283. printf("ajaj");
  284. return 1;
  285. }
  286. //sendto(sock,"ahoj", 4, 0, (struct sockaddr *) &s_server, slen);
  287. //rread(0, buf, buflen);
  288. //while ()
  289.  
  290.  
  291. print_c_menu();
  292.  
  293. while (control!='q'){
  294. control = 'a';
  295. FD_ZERO(&fds);
  296. FD_SET(0, &fds);
  297. FD_SET(sock, &fds);
  298. rset = fds;
  299. tv.tv_sec = 2;
  300. tv.tv_usec = 0;
  301. select(sock+1, &rset, NULL, NULL, &tv);
  302.  
  303. if( FD_ISSET(STDIN, &rset)){
  304. // stdin
  305. scanf("%c", &control);
  306. getchar();
  307.  
  308. if (control=='s') {
  309. fprintf(stdout," Velkost fragmentu je %d B\n", *fragment_size);
  310. }
  311. if (control=='h') print_c_menu();
  312. if (control=='t') {
  313. FD_ZERO(&fds);
  314. FD_SET(0, &fds);
  315. FD_SET(sock, &fds);
  316. rset = fds;
  317. tv.tv_sec = 200;
  318. tv.tv_usec = 0;
  319. select(sock+1, &rset, NULL, NULL, &tv);
  320. send_handshake(sock, fragment_size, &s_server, slen);
  321. recieve_handshake(sock,&s_server, slen, &handshake_control);
  322. // if (handshake_control == *fragment_size) fprintf(stdout, "\nhandshaked");
  323. send_text(sock, &s_server, *fragment_size, slen);
  324. }
  325. }
  326. }
  327.  
  328. // recvfrom(sock, buf, buflen, 0, (struct sockaddr*)&s_server, &slen);
  329.  
  330. //puts(buf);
  331.  
  332. close(sock);
  333. return 0;
  334. }
  335.  
  336.  
  337. int send_ack(int s, struct sockaddr_in *s_client, int slen){
  338. u_char ack[10];
  339. ack[0] = 0/256;
  340. ack[1] = 0%256;
  341.  
  342. sendto(s, ack, 10 ,0, (struct sockaddr*) s_client, slen);
  343. return 0;
  344. }
  345.  
  346.  
  347. int send_text(int s, struct sockaddr_in *s_client, int fragment_size, int slen){
  348.  
  349. char *msg;
  350. char ack[10];
  351. msg = (char *) malloc(10+fragment_size*sizeof(char));
  352. int cur_num=1;
  353. int r;
  354. r = read(0, msg+10, fragment_size);
  355. while ( r != 0 ){
  356. *(int*)(msg+FRAGMENT_NUM) = cur_num;
  357. msg[0] = fragment_size/256;
  358. msg[1] = fragment_size%256;
  359. // crc
  360. while (type_of_packet(ack) != ACK_TYPE) {
  361. sendto(s, msg, 10 + r, 0, (struct sockaddr *) s_client, slen);
  362. recvfrom(s, ack, 10, 0, (struct sockaddr *) &s_client, slen);
  363. }
  364. ack[0] ='e';
  365. if (r == fragment_size) r = read(0, msg+10, fragment_size);
  366. else r = 0;
  367. cur_num++;
  368. }
  369.  
  370. send_ack(s, &s_client, slen);
  371.  
  372. return 0;
  373. }
  374.  
  375. int parse_dgram(u_char *data, Fragment *dgram_arr){
  376. Fragment *cur;
  377. int i = 0;
  378. // if (crc)
  379. cur = (Fragment *) malloc(sizeof(Fragment));
  380. if (dgram_arr != NULL) dgram_arr->prev = cur;
  381. cur->next = dgram_arr;
  382.  
  383. cur->data = (u_char *) malloc(get_size(data) * sizeof(u_char));
  384.  
  385. for (i; i <= get_size(data); i++) {
  386. cur->data[i] = data[DATA];
  387. }
  388. cur->current_number = get_current_number(data);
  389. cur->prev = NULL;
  390. dgram_arr = cur;
  391. //end if crc
  392. //else return 1;
  393. return 0;
  394. }
  395.  
  396.  
  397.  
  398. void main_menu(){
  399. fprintf(stdout,"\nHLAVNE MENU:\n\n");
  400. fprintf(stdout,"\th -> zobrazenie hlavneho menu\n");
  401. fprintf(stdout,"\tc -> spustenie klienta\n");
  402. fprintf(stdout,"\ts -> spustenie servera\n");
  403. fprintf(stdout,"\tw -> nastavenia\n");
  404. fprintf(stdout,"\tq -> ukncenie programu\n\n");
  405. fprintf(stdout,"Vyberte moznost stlacenim klavesy: \n");
  406.  
  407.  
  408. }
  409.  
  410. void print_s_menu(){
  411. fprintf(stdout,"\nSERVER MENU:\n\n");
  412. fprintf(stdout,"\th -> zobrazenie serveroveho menu\n");
  413. fprintf(stdout,"\ts -> zobrazenie velkosti fragmentu\n");
  414. fprintf(stdout,"\tq -> zatvorenie servera\n\n");
  415. fprintf(stdout,"Vyberte moznost stlacenim klavesy: \n");
  416.  
  417.  
  418. }
  419.  
  420. void print_c_menu(){
  421. fprintf(stdout,"\nKLIENT MENU:\n\n");
  422. fprintf(stdout,"\th -> zobrazenie klientoveho menu\n");
  423. fprintf(stdout,"\ts -> zobrazenie velkosti fragmentu\n");
  424. fprintf(stdout,"\tt -> poslanie textovej spravy\n");
  425. fprintf(stdout,"\tq -> zatvorenie klienta\n\n");
  426. fprintf(stdout,"Vyberte moznost stlacenim klavesy: \n");
  427.  
  428.  
  429. }
  430.  
  431. int send_handshake(int s, int *size, struct sockaddr_in *s_client, int slen){
  432. u_char data[]={'0','0','0','0','0','0','0','0','0','0'};
  433. u_char rec_data[11];
  434. int recv_len;
  435.  
  436. *(int*)(data+FRAGMENT_NUM) = 0;
  437. data[0] = *size/256;
  438. data[1] = *size%256;
  439. //crc
  440. sendto(s, data, 10, 0, (struct sockaddr *) s_client, slen);
  441. // recv
  442.  
  443. return 0;
  444. }
  445.  
  446. int recieve_handshake(int s, struct sockaddr_in *s_client, int slen, int *fragment_size){
  447. u_char data[10];
  448. u_char ret_data [11];
  449. if ( recvfrom(s, data, 10, 0, (struct sockaddr*) s_client, &slen) == -1){
  450. return 1;
  451. }
  452. //crc chceck
  453. *fragment_size = data[0]*256;
  454. *fragment_size += data[1];
  455.  
  456.  
  457. return 0;
  458. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement