fork download
  1. #if defined _WIN32 || defined _WIN64
  2. #include <winsock2.h>
  3. #include <ws2tcpip.h>
  4. #include <windows.h>
  5. #else
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <arpa/inet.h>
  10. #include <netinet/in.h>
  11. #include <netdb.h>
  12. #endif
  13.  
  14. #include <stdio.h>
  15. #include <string.h>
  16.  
  17. #define min(a, b) (((a)<(b))?(a):(b))
  18. #define max(a, b) (((a)>(b))?(a):(b))
  19.  
  20. #ifndef __cplusplus
  21. typedef enum {false, true} bool;
  22. #endif
  23.  
  24. typedef struct
  25. {
  26. int sock;
  27. const char* address;
  28. unsigned short port;
  29. } sock_info;
  30.  
  31.  
  32. const char* GetHostLocation(char* Buffer, sock_info* info)
  33. {
  34. const char* addr = strstr(info->address, "://");
  35.  
  36. if (addr)
  37. strcpy(Buffer, addr + 3);
  38.  
  39. if ((addr = strstr(Buffer, "/")))
  40. Buffer[addr - Buffer] = '\0';
  41.  
  42. return addr ? Buffer : NULL;
  43. }
  44.  
  45. const char* GetRequestLocation(char* Buffer, sock_info* info)
  46. {
  47. const char* addr = strstr(info->address, "://");
  48.  
  49. if (Buffer)
  50. {
  51. if (addr)
  52. strcpy(Buffer, addr + 3);
  53.  
  54. if ((addr = strstr(Buffer, "/")))
  55. {
  56. strcpy(Buffer, addr + 1);
  57. }
  58. }
  59. else
  60. {
  61. addr = strstr(addr + 3, "/");
  62. return addr ? addr + 1 : NULL;
  63. }
  64.  
  65. return addr ? Buffer : NULL;
  66. }
  67.  
  68. bool init()
  69. {
  70. #if defined _WIN32 || defined _WIN64
  71. WSADATA wsaData = {0};
  72. return !WSAStartup(MAKEWORD(2, 2), &wsaData);
  73. #else
  74. return true;
  75. #endif
  76. }
  77.  
  78. void destroy(sock_info* info)
  79. {
  80. #if defined _WIN32 || defined _WIN64
  81. shutdown(info->sock, SD_BOTH);
  82. closesocket(info->sock);
  83. WSACleanup();
  84. #else
  85. shutdown(info->sock, SHUT_RDWR);
  86. close(info->sock);
  87. #endif
  88. }
  89.  
  90. bool setup(sock_info* info)
  91. {
  92. char Buffer[512] = {0};
  93. const char* address_str = info->address;
  94. struct sockaddr_in* sockaddr_ipv4 = NULL;
  95.  
  96. if (strncasecmp(address_str, "inaddr_any", min(strlen(info->address), 10)))
  97. {
  98. address_str = GetHostLocation(Buffer, info);
  99.  
  100. struct addrinfo* it = NULL, *result = NULL;
  101. getaddrinfo(address_str, NULL, NULL, &result);
  102. for (it = result; it != NULL; it = it->ai_next)
  103. {
  104. sockaddr_ipv4 = (struct sockaddr_in*)it->ai_addr;
  105. address_str = inet_ntoa(sockaddr_ipv4->sin_addr);
  106.  
  107. if (strncmp(address_str, "0.0.0.0", 7))
  108. break;
  109. }
  110. freeaddrinfo(result);
  111. }
  112.  
  113. if ((info->sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  114. {
  115. return false;
  116. }
  117.  
  118. struct sockaddr_in SockAddr;
  119. memset(&SockAddr, 0, sizeof(SockAddr));
  120. SockAddr.sin_port = htons(info->port);
  121. SockAddr.sin_family = AF_INET;
  122. SockAddr.sin_addr.s_addr = (!strncasecmp(address_str, "inaddr_any", 10) ? htonl(INADDR_ANY) : inet_addr(address_str));
  123.  
  124. if (connect(info->sock, (struct sockaddr*)&SockAddr, sizeof(SockAddr)) < 0)
  125. {
  126. return false;
  127. }
  128.  
  129. return true;
  130. }
  131.  
  132. void CreateGetHeader(char* buffer, sock_info* info)
  133. {
  134. const char* header =
  135. {
  136. "Connection: close\r\n"\
  137. "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11\r\n"\
  138. "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
  139. "Accept-Language: en-US,en;q=0.8\r\n"\
  140. "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n"\
  141. "Cache-Control: no-cache\r\n"
  142. };
  143.  
  144. const char* Request = "GET /%s HTTP/1.1\r\n"\
  145. "Host: %s\r\n"\
  146. "%s\r\n";
  147.  
  148. char HostBuffer[512] = {0};
  149. sprintf(buffer, Request, GetRequestLocation(NULL, info), GetHostLocation(HostBuffer, info), header);
  150. }
  151.  
  152. int main()
  153. {
  154. sock_info info = {0, "http://stackoverflow.com/questions/tagged/c%2b%2b", 80};
  155.  
  156. if (init())
  157. {
  158. if (setup(&info))
  159. {
  160. char RequestBuffer[1024] = {0};
  161. CreateGetHeader(RequestBuffer, &info);
  162. send(info.sock, RequestBuffer, strlen(RequestBuffer), 0);
  163. memset(&RequestBuffer, 0, sizeof(RequestBuffer));
  164.  
  165. recv(info.sock, &RequestBuffer[0], sizeof(RequestBuffer), 0);
  166. printf("%s", RequestBuffer);
  167.  
  168. int bytes_read = 0;
  169.  
  170. while(true)
  171. {
  172. int read = recv(info.sock, RequestBuffer, sizeof(RequestBuffer), 0);
  173. if (read <= 0)
  174. break;
  175.  
  176. RequestBuffer[read] = NULL;
  177. printf("%s", RequestBuffer);
  178.  
  179. bytes_read += read;
  180.  
  181. if (bytes_read >= 88500)
  182. break;
  183.  
  184. memset(RequestBuffer, 0, sizeof(RequestBuffer));
  185. }
  186. }
  187.  
  188. destroy(&info);
  189. }
  190.  
  191. return 0;
  192. }
  193.  
Success #stdin #stdout 0s 2552KB
stdin
Standard input is empty
stdout
Standard output is empty