Advertisement
NickG

Untitled

Feb 24th, 2014
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.45 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <uv.h>
  5. #include "mcp.h"
  6.  
  7. typedef struct {
  8.     int state;
  9.     uv_buf_t buf;
  10.     int32_t read_len;
  11.     uv_tcp_t tcp;
  12.     uv_connect_t connect_req;
  13.     uv_shudown_t shutdown_req;
  14. } client_t;
  15.  
  16. static mcp_hs00_t handshake = {
  17.     .protocol_version = 5,
  18.     .addr_len         = strlen("127.0.0.1"),
  19.     .server_addr      = "127.0.0.1",
  20.     .server_port      = 25565,
  21.     .next_state       = 2
  22. };
  23.  
  24. static mcp_ss00_t ping_req;
  25.  
  26. void buf_alloc(uv_handle_t *tcp, size_t size, uv_buf_t *buf) {
  27.     *buf = uv_buf_init(malloc(size), size);
  28. }
  29.  
  30. void pinger_close_cb(uv_handle_t* handle) {
  31.     //ToDo: Implement
  32. }
  33.  
  34. void client_write_cb(uv_write_t *req, int status) {
  35.     free(req->data);
  36.     free(req)
  37. }
  38.  
  39. void client_read_cb(uv_stream_t *tcp, ssize_t nread, const uv_buf_t *buf) {
  40.     client_t *client = (client_t*)tcp->data;
  41.  
  42.     if(nread<0) {
  43.         if (buf->base) {
  44.             free(buf->base);
  45.         }
  46.         free(base);
  47.         uv_close((uv_handle_t*)tcp, client_close_cb);
  48.         return;
  49.     }
  50.  
  51.     if(client->read_len < 0) {
  52.        
  53.     }
  54. }
  55.  
  56. void client_write_handshake(client_t *client) {
  57.     uv_write_t *req;
  58.     uv_buf_t buf;
  59.     uint8_t pbuf[4096];
  60.     int ret = mcp_encode_hs00(pbuf, &handshake, 4096);
  61.     buf = uv_buf_init(memcpy(malloc(ret), pbuf, ret), ret);
  62.     req = malloc(sizeof(*req));
  63.     req->data = buf.base;
  64.     client->state = 0x02;
  65.     uv_write(req, (uv_stream_t*)&client->tcp, &buf, 1, client_write_cb);
  66. }
  67.  
  68. void client_write_pingreq(client_t *client) {
  69.     uv_write_t *req;
  70.     uv_buf_t buf;
  71.     uint8_t pbuf[4096];
  72.     int ret = mcp_encode_ss00(pbuf, &ping_req, 4096);
  73.     buf = uv_buf_init(memcpy(malloc(ret), pbuf, ret), ret);
  74.     req = malloc(sizeof(*req));
  75.     req->data = buf.base;
  76.     uv_write(req, (uv_stream_t*)&client->tcp, &buf, 1, client_write_cb);
  77. }
  78.  
  79. void client_connect_cb(uv_connect_t *req, int status) {
  80.     client_t *client = (client_t*)req->handle->data;
  81.     client_write_handshake(client);
  82.     client_write_pingreq(client);
  83.     uv_read_start(req->handle, buf_alloc, client_read_cb);
  84. }
  85.  
  86. int main(int argc, char *argv[]) {
  87.     struct sockaddr_in server_addr;
  88.     uv_loop_t *loop = uv_default_loop();
  89.     client_t myclient;
  90.     uv_ip4_addr("127.0.0.1", 25565, &server_addr);
  91.     uv_tcp_init(loop, &myclient.tcp);
  92.     myclient.state = 0;
  93.     myclient.buf.len = 4096;
  94.     myclient.buf.base = malloc(4096);
  95.     myclient.tcp.data = &myclient;
  96.     uv_tcp_connect(
  97.         &myclient.connect_req,
  98.         &myclient.tcp,
  99.         (struct sockaddr*)&server_addr,
  100.         client_connect_cb
  101.     );
  102.     return uv_run(loop, UV_RUN_DEFAULT);
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement