client.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "hloop.h"
  2. #include "htime.h"
  3. #include "hsocket.h"
  4. #define RECV_BUFSIZE 8192
  5. void on_timer(htimer_t* timer, void* userdata) {
  6. static int cnt = 0;
  7. printf("on_timer timer_id=%d time=%luus cnt=%d\n", timer->timer_id, timer->loop->cur_time, ++cnt);
  8. }
  9. void on_idle(hidle_t* idle, void* userdata) {
  10. static int cnt = 0;
  11. printf("on_idle idle_id=%d cnt=%d\n", idle->idle_id, ++cnt);
  12. }
  13. void on_read(hevent_t* event, void* userdata) {
  14. printf("on_read fd=%d\n", event->fd);
  15. char recvbuf[RECV_BUFSIZE] = {0};
  16. int nrecv;
  17. recv:
  18. memset(recvbuf, 0, sizeof(recvbuf));
  19. nrecv = recv(event->fd, recvbuf, sizeof(recvbuf), 0);
  20. printf("recv retval=%d\n", nrecv);
  21. if (nrecv < 0) {
  22. if (sockerrno != NIO_EAGAIN) {
  23. //goto recv_done;
  24. return;
  25. }
  26. else {
  27. perror("recv");
  28. goto recv_error;
  29. }
  30. }
  31. if (nrecv == 0) {
  32. goto disconnect;
  33. }
  34. printf("> %s\n", recvbuf);
  35. if (nrecv == sizeof(recvbuf)) {
  36. goto recv;
  37. }
  38. recv_error:
  39. disconnect:
  40. printf("closesocket fd=%d\n", event->fd);
  41. closesocket(event->fd);
  42. hevent_del(event);
  43. }
  44. void on_connect(hevent_t* event, void* userdata) {
  45. printf("on_connect connfd=%d\n", event->fd);
  46. struct sockaddr_in localaddr,peeraddr;
  47. socklen_t addrlen = sizeof(struct sockaddr_in);
  48. int ret = getpeername(event->fd, (struct sockaddr*)&peeraddr, &addrlen);
  49. if (ret < 0) {
  50. printf("connect failed: %s: %d\n", strerror(sockerrno), sockerrno);
  51. closesocket(event->fd);
  52. return;
  53. }
  54. addrlen = sizeof(struct sockaddr_in);
  55. getsockname(event->fd, (struct sockaddr*)&localaddr, &addrlen);
  56. printf("connect connfd=%d [%s:%d] => [%s:%d]\n", event->fd,
  57. inet_ntoa(localaddr.sin_addr), ntohs(localaddr.sin_port),
  58. inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));
  59. hevent_read(event->loop, event->fd, on_read, NULL);
  60. static const char* http_request = "GET / HTTP/1.1\r\n\r\n";
  61. int nsend = send(event->fd, http_request, strlen(http_request), 0);
  62. printf("send retval=%d\n", nsend);
  63. printf("< %s\n", http_request);
  64. }
  65. int main(int argc, char** argv) {
  66. if (argc < 3) {
  67. printf("Usage: cmd host port\n");
  68. return -10;
  69. }
  70. const char* host = argv[1];
  71. int port = atoi(argv[2]);
  72. int connfd = Connect(host, port, 1);
  73. printf("connfd=%d\n", connfd);
  74. if (connfd < 0) {
  75. return connfd;
  76. }
  77. hloop_t loop;
  78. hloop_init(&loop);
  79. //hidle_add(&loop, on_idle, NULL);
  80. htimer_add(&loop, on_timer, NULL, 1000, INFINITE);
  81. hevent_connect(&loop, connfd, on_connect, NULL);
  82. hloop_run(&loop);
  83. return 0;
  84. }