main.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <uv.h>
  5. uv_loop_t *loop;
  6. void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
  7. buf->base = malloc(suggested_size);
  8. buf->len = suggested_size;
  9. }
  10. void on_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
  11. if (nread < 0) {
  12. if (nread != UV_EOF)
  13. fprintf(stderr, "Read error %s\n", uv_err_name(nread));
  14. uv_close((uv_handle_t*) client, NULL);
  15. free(buf->base);
  16. free(client);
  17. return;
  18. }
  19. char *data = (char*) malloc(sizeof(char) * (nread+1));
  20. data[nread] = '\0';
  21. strncpy(data, buf->base, nread);
  22. fprintf(stderr, "%s", data);
  23. free(data);
  24. free(buf->base);
  25. }
  26. void on_connect(uv_connect_t *req, int status) {
  27. if (status < 0) {
  28. fprintf(stderr, "connect failed error %s\n", uv_err_name(status));
  29. free(req);
  30. return;
  31. }
  32. uv_read_start((uv_stream_t*) req->handle, alloc_buffer, on_read);
  33. free(req);
  34. }
  35. void on_resolved(uv_getaddrinfo_t *resolver, int status, struct addrinfo *res) {
  36. if (status < 0) {
  37. fprintf(stderr, "getaddrinfo callback error %s\n", uv_err_name(status));
  38. return;
  39. }
  40. char addr[17] = {'\0'};
  41. uv_ip4_name((struct sockaddr_in*) res->ai_addr, addr, 16);
  42. fprintf(stderr, "%s\n", addr);
  43. uv_connect_t *connect_req = (uv_connect_t*) malloc(sizeof(uv_connect_t));
  44. uv_tcp_t *socket = (uv_tcp_t*) malloc(sizeof(uv_tcp_t));
  45. uv_tcp_init(loop, socket);
  46. uv_tcp_connect(connect_req, socket, (const struct sockaddr*) res->ai_addr, on_connect);
  47. uv_freeaddrinfo(res);
  48. }
  49. int main() {
  50. loop = uv_default_loop();
  51. struct addrinfo hints;
  52. hints.ai_family = PF_INET;
  53. hints.ai_socktype = SOCK_STREAM;
  54. hints.ai_protocol = IPPROTO_TCP;
  55. hints.ai_flags = 0;
  56. uv_getaddrinfo_t resolver;
  57. fprintf(stderr, "irc.freenode.net is... ");
  58. int r = uv_getaddrinfo(loop, &resolver, on_resolved, "irc.freenode.net", "6667", &hints);
  59. if (r) {
  60. fprintf(stderr, "getaddrinfo call error %s\n", uv_err_name(r));
  61. return 1;
  62. }
  63. return uv_run(loop, UV_RUN_DEFAULT);
  64. }