Advertisement
Guest User

Untitled

a guest
Apr 18th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.73 KB | None | 0 0
  1. // gcc -Os -s -nostartfiles -e _entry -I./include -L. tcp_client.c -o tcp_client -luv -lws2_32 -lpsapi -liphlpapi -luserenv
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <uv.h>
  5.  
  6. void tcp_read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf){
  7.     puts(buf->base);
  8. }
  9.  
  10. void tcp_alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf){
  11.     buf->base = malloc(suggested_size);
  12.     buf->len  = suggested_size;
  13. }
  14.  
  15. void tcp_write_cb(uv_write_t* req, int status){
  16.     printf("write -> %d\n", status);
  17.  
  18.     uv_read_start(req->handle, tcp_alloc_cb, tcp_read_cb);
  19. }
  20.  
  21. void tcp_connect_cb(uv_connect_t* req, int status){
  22.     printf("connect -> %d\n", status);
  23.  
  24.     uv_buf_t bufs[1];
  25.     uint8_t msg[] = "GET / HTTP/1.1\r\n"
  26.                     "Host: google.fr\r\n"
  27.                     "Connection: close\r\n"
  28.                     "\r\n";
  29.     bufs[0].base = msg;
  30.     bufs[0].len  = sizeof(msg);
  31.  
  32.     uv_write(NULL, req->handle, bufs, 1, tcp_write_cb);
  33. }
  34.  
  35. void tcp_getaddrinfo_cb(uv_getaddrinfo_t* req0, int status, struct addrinfo* res){
  36.     printf("getaddrinfo -> %d\n", status);
  37.  
  38.     uv_tcp_t tcp;
  39.     uv_tcp_init(req0->loop, &tcp);
  40.  
  41.     uint8_t addr[16];
  42.     uv_ip4_name((struct sockaddr_in*)res->ai_addr, addr, sizeof(addr));
  43.     printf("ip4_name -> %s", addr);
  44.  
  45.     uv_connect_t req1;
  46.     uv_tcp_connect(&req1, &tcp, res->ai_addr, tcp_connect_cb);
  47.  
  48.     uv_freeaddrinfo(res);
  49. }
  50.  
  51. void tcp_idle_cb(uv_idle_t *idle){
  52.     printf("idle -> %d\n", uv_now(idle->loop));
  53.     uv_idle_stop(idle);
  54. }
  55.  
  56. void entry(){
  57.     uv_loop_t *loop = uv_default_loop();
  58.  
  59.     uv_idle_t idle;
  60.     uv_idle_init(loop, &idle);
  61.  
  62.     uv_idle_start(&idle, tcp_idle_cb);
  63.  
  64.     uv_getaddrinfo_t req;
  65.     uv_getaddrinfo(loop, &req, tcp_getaddrinfo_cb, "google.fr", "http", NULL);
  66.  
  67.     uv_run(loop, UV_RUN_DEFAULT);
  68.  
  69.     uv_loop_close(loop);
  70.     exit(0x00);
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement