Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // gcc -Os -s -nostartfiles -e _entry -I./include -L. tcp_client.c -o tcp_client -luv -lws2_32 -lpsapi -liphlpapi -luserenv
- #include <stdint.h>
- #include <stdio.h>
- #include <uv.h>
- void tcp_read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf){
- puts(buf->base);
- }
- void tcp_alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf){
- buf->base = malloc(suggested_size);
- buf->len = suggested_size;
- }
- void tcp_write_cb(uv_write_t* req, int status){
- printf("write -> %d\n", status);
- uv_read_start(req->handle, tcp_alloc_cb, tcp_read_cb);
- }
- void tcp_connect_cb(uv_connect_t* req, int status){
- printf("connect -> %d\n", status);
- uv_buf_t bufs[1];
- uint8_t msg[] = "GET / HTTP/1.1\r\n"
- "Host: google.fr\r\n"
- "Connection: close\r\n"
- "\r\n";
- bufs[0].base = msg;
- bufs[0].len = sizeof(msg);
- uv_write(NULL, req->handle, bufs, 1, tcp_write_cb);
- }
- void tcp_getaddrinfo_cb(uv_getaddrinfo_t* req0, int status, struct addrinfo* res){
- printf("getaddrinfo -> %d\n", status);
- uv_tcp_t tcp;
- uv_tcp_init(req0->loop, &tcp);
- uint8_t addr[16];
- uv_ip4_name((struct sockaddr_in*)res->ai_addr, addr, sizeof(addr));
- printf("ip4_name -> %s", addr);
- uv_connect_t req1;
- uv_tcp_connect(&req1, &tcp, res->ai_addr, tcp_connect_cb);
- uv_freeaddrinfo(res);
- }
- void tcp_idle_cb(uv_idle_t *idle){
- printf("idle -> %d\n", uv_now(idle->loop));
- uv_idle_stop(idle);
- }
- void entry(){
- uv_loop_t *loop = uv_default_loop();
- uv_idle_t idle;
- uv_idle_init(loop, &idle);
- uv_idle_start(&idle, tcp_idle_cb);
- uv_getaddrinfo_t req;
- uv_getaddrinfo(loop, &req, tcp_getaddrinfo_cb, "google.fr", "http", NULL);
- uv_run(loop, UV_RUN_DEFAULT);
- uv_loop_close(loop);
- exit(0x00);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement