Advertisement
Guest User

t4

a guest
Mar 31st, 2020
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.63 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netdb.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <string.h>
  7. #include <arpa/inet.h>
  8. #include <signal.h>
  9. #include <stdlib.h>
  10. #include <ifaddrs.h>
  11.  
  12.  
  13. // Apufunktio osoitteen tulostamiseen
  14. void print_address(const char *prefix, const struct addrinfo *res) {
  15. char outbuf[80];
  16. struct sockaddr_in *sin = (struct sockaddr_in *)res->ai_addr;
  17. struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)res->ai_addr;
  18. void *address;
  19.  
  20. if (res->ai_family == AF_INET)
  21. address = &(sin->sin_addr);
  22. else if (res->ai_family == AF_INET6)
  23. address = &(sin6->sin6_addr);
  24. else {
  25. printf("Unknown address\n");
  26. return;
  27. }
  28.  
  29. const char *ret = inet_ntop(res->ai_family, address,
  30. outbuf, sizeof(outbuf));
  31. printf("%s %s\n", prefix, ret);
  32. }
  33.  
  34.  
  35. int main(int argc , char *argv[]) {
  36. int sock, n;
  37. struct sockaddr_in server;
  38. char server_reply[2000];
  39. char *message1 = "594930\n";
  40. char *message2 = "4-names\n";
  41. char *address = "195.148.124.236";
  42.  
  43. //Create socket
  44. if ((sock = socket(AF_INET , SOCK_STREAM , 0)) < 0) {
  45. printf("Could not create socket");
  46. perror("socket error");
  47. return 1;
  48. }
  49.  
  50. puts("Socket created");
  51.  
  52.  
  53.  
  54. // Alustetaan osoitetta esittävä tietorakenne nollilla.
  55. // Sen jälkeen kerrotaan että osoiteperhe on IPv4,
  56. // ja määritellään palvelimen portti johon tullaan ottamaan yhteyttä
  57. memset(&server, 0, sizeof(server));
  58. server.sin_family = AF_INET;
  59. server.sin_port = htons(5000); /* daytime server = 13 */
  60.  
  61. // Seuraava funktio muuntaa ASCII-muotoisen IP-osoitteen binääriseksi.
  62. // Se talletetaan servaddr - rakenteeseen.
  63. if (inet_pton(AF_INET, address, &server.sin_addr) <= 0) {
  64. fprintf(stderr, "inet_pton error for %s\n", address);
  65. return 1;
  66. }
  67.  
  68.  
  69. /*Toinen tapa
  70. server.sin_addr.s_addr = inet_addr("195.148.124.236");
  71. server.sin_family = AF_INET;
  72. server.sin_port = htons( 5000 );*/
  73.  
  74. //Connect to remote server
  75. if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) {
  76. perror("connect failed. Error");
  77. return 1;
  78. }
  79.  
  80. //Send student number
  81. if( send(sock , message1 , strlen(message1) , 0) < 0) {
  82. puts("Send failed");
  83. return 1;
  84. }
  85.  
  86. //Send message
  87. if( send(sock , message2 , strlen(message2) , 0) < 0) {
  88. puts("Send failed");
  89. return 1;
  90. }
  91.  
  92. //Receive a reply from the server
  93. if( (n = recv(sock , server_reply , 2000 , 0)) < 0) {
  94. puts("recv failed");
  95. }
  96.  
  97. puts(server_reply);
  98. //char *str1 = "OK\n";
  99. //char *str2 = "FAIL\n";
  100. int sendFailed = 0;
  101.  
  102. while ((strstr(server_reply, "OK") == NULL) && (strstr(server_reply, "FAIL") == NULL)) {
  103.  
  104. //Variables for new address and port
  105. int ret;//, newPort;
  106. char newPort[20];
  107. char host[50];
  108. char conn[10];
  109.  
  110. //Copy address and port
  111. ret = sscanf(server_reply, "%s %s %s", conn, host, newPort);
  112. printf("%d %s %s\n", ret, host, newPort);
  113.  
  114. //New variables for socket
  115. int sock2;
  116. struct addrinfo hints, *res, *ressave;
  117.  
  118. // Ensiksi kerrotaan hints-rakenteessa, että osoiteperhettä ei ole
  119. // rajoitettu, eli sekä IPv4 ja IPv6 - osoitteet kelpaavat.
  120. // Lisäksi sanomme, että olemme pelkästään kiinnostuneita TCP-yhteyksistä
  121. memset(&hints, 0, sizeof(struct addrinfo));
  122. hints.ai_family = AF_UNSPEC;
  123. hints.ai_socktype = SOCK_STREAM;
  124.  
  125. puts(server_reply);
  126.  
  127. // Tehdään nimikysely käyttäen ylläolevaa hints-rakennetta
  128. // Funktio varaa vastaukselle tilan itse, osoitin palautuu res-muuttujaan
  129. if ( (n = getaddrinfo(host, newPort, &hints, &res)) != 0) {
  130. fprintf(stderr, "tcp_connect error for %s, %s: %s\n", host, newPort, gai_strerror(n));
  131. exit(1);
  132. }
  133.  
  134. ressave = res; // so that we can release the memory afterwards
  135.  
  136. // res-rakenne osoittaa linkitettyyn listaan. Käydään läpi linkitettyä
  137. // listaa yksi kerrallaan ja yritetään yhdistää saatuun osoitteeseen.
  138. // res-rakenne sisältää kaikki parameterit mitä tarvitsemme socket-
  139. // ja connect - kutsuissa.
  140. do {
  141. sock2 = socket(res->ai_family, res->ai_socktype,
  142. res->ai_protocol);
  143. if (sock2 < 0)
  144. continue; /* ignore this one */
  145.  
  146. print_address("Trying to connect", res);
  147.  
  148. // Mikäli yhteys onnistuu, silmukka keskeytetään välittömästi,
  149. // koska meillä on toimiva yhteys, eikä loppuja osoitteita
  150. // tarvitse kokeilla
  151. if (connect(sock2, res->ai_addr, res->ai_addrlen) == 0)
  152. break; /* success */
  153.  
  154. printf("connect failed\n");
  155.  
  156. close(sock2); /* ignore this one */
  157. } while ( (res = res->ai_next) != NULL);
  158.  
  159.  
  160.  
  161. // Päästiinkö linkitetyn listan loppuun, mutta yhteys ei onnistunut?
  162. // ==> virhe
  163. if (res == NULL) { /* errno set from final connect() */
  164. fprintf(stderr, "tcp_connect error for %s\n", host);
  165. sock2 = -1;
  166. sendFailed = 1;
  167.  
  168. //Send FAIL to first sock
  169. char *message4 = "FAIL\n";
  170. if( send(sock , message4 , strlen(message4) , 0) < 0) {
  171. puts("Send failed");
  172. }
  173.  
  174. } else {
  175. print_address("We are using address", res);
  176. }
  177.  
  178. // Järjestelmä on varannut muistin linkitetylle listalle, se pitää vapauttaa
  179. freeaddrinfo(ressave);
  180.  
  181. //Stuff to send to first socket
  182. char message3[80];
  183. //sprintf(message3, "ADDR 195.148.125.210 %s %s\n", newPort, message1);
  184.  
  185. char hostname[128];
  186. char myIP[100];
  187.  
  188. if (!sendFailed) {
  189. gethostname(hostname, sizeof hostname);
  190. printf("My hostname: %s\n", hostname);
  191.  
  192. struct hostent *he;
  193. struct sockaddr_in sa;
  194. he = gethostbyname(hostname);
  195. sa.sin_family = he->h_addrtype;
  196. strcpy(myIP, inet_ntoa(sa.sin_addr));
  197. memcpy(&sa.sin_addr, he->h_addr, sizeof(sa.sin_addr));
  198.  
  199. printf("\n\n%s\n\n",inet_ntoa(sa.sin_addr));
  200.  
  201. struct sockaddr_in sin;
  202. socklen_t len = sizeof(sin);
  203. if (getsockname(sock2, (struct sockaddr *)&sin, &len) == -1) {
  204. perror("getsockname");
  205. }
  206. int local_port = ntohs(sin.sin_port);
  207.  
  208. printf("%d\n",local_port);
  209.  
  210. //sprintf(message3, "ADDR %s %s %s", inet_ntoa(sa.sin_addr), newPort, message1);
  211. sprintf(message3, "ADDR %s %d %s\n", inet_ntoa(sa.sin_addr), local_port, message1);
  212.  
  213. puts(message3);
  214.  
  215. //Send message
  216. if( send(sock2, message3 , strlen(message3) , 0) < 0) {
  217. puts("Send failed");
  218. return 1;
  219. }
  220.  
  221.  
  222. }
  223.  
  224. //Receive a reply from the first server
  225. if( (n = recv(sock , server_reply , 2000 , 0)) < 0) {
  226. puts("recv failed");
  227. }
  228.  
  229. puts(server_reply);
  230. puts("Print reply again");
  231. puts(server_reply);
  232.  
  233. }
  234.  
  235.  
  236. close(sock);
  237. return 0;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement