1+ #include <stdio.h>
2+ #include <string.h>
3+ #include <WinSock2.h>
4+ // #pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll
5+
6+ typedef void Fun (char * );
7+
8+ #define MAXLINE 100
9+
10+ void get_admin (const char * url , char * admin )
11+ {
12+ int start = 7 ;
13+ if (strstr (url , "https" ))
14+ start ++ ;
15+ char * ret = strchr (url + start , '/' );
16+ int admin_len = ret ? ret - url - start : strlen (url )- start ;
17+
18+ strncpy (admin , url + start , admin_len );
19+ }
20+
21+ void get_admin_ip (const char * url , char * ip )
22+ {
23+ char admin [30 ];
24+ get_admin (url , admin );
25+
26+ struct hostent * phst = gethostbyname (admin );
27+ struct in_addr * iddr = (struct in_addr * )phst -> h_addr ;
28+ inet_ntoa (* iddr );
29+ strcpy (ip , inet_ntoa (* iddr ));
30+ }
31+
32+ int get_url_port (const char * url )
33+ {
34+ char * ret = strstr (url , "https" );
35+
36+ return ret ? 443 : 80 ;
37+ }
38+
39+ void request (const char * sUrl , Fun fun )
40+ {
41+ struct sockaddr_in servaddr ;
42+ char buf [MAXBYTE ];
43+ char format_msg [] = (
44+ "GET %s HTTP/1.1\r\n"
45+ "Host: %s\r\n"
46+ "User-Agent: curl/7.79.1\r\n"
47+ "Accept: */*\r\n\r\n"
48+ );
49+ char send_msg [strlen (format_msg ) + strlen (sUrl )* 2 ];
50+ char admin [30 ];
51+ char ip [20 ];
52+ int port ;
53+ int r ;
54+ SOCKET sockfd ;
55+
56+ WSADATA wsaData ;
57+ WSAStartup (MAKEWORD (2 , 2 ), & wsaData );
58+
59+ port = get_url_port (sUrl );
60+ get_admin_ip (sUrl , ip );
61+ get_admin (sUrl , admin );
62+ sprintf (send_msg , format_msg , sUrl , admin );
63+ // puts(send_msg);
64+
65+ sockfd = socket (AF_INET , SOCK_STREAM , 0 );
66+
67+ memset (& servaddr , 0 , sizeof (servaddr ));
68+
69+ servaddr .sin_family = AF_INET ;
70+ servaddr .sin_addr .s_addr = inet_addr (ip );
71+ servaddr .sin_port = htons (port );
72+
73+ connect (sockfd , (struct sockaddr * )& servaddr , sizeof (servaddr ));
74+ send (sockfd , send_msg , strlen (send_msg ), 0 );
75+
76+ do {
77+ r = recv (sockfd , buf , MAXBYTE , 0 );
78+ if (r < 255 )
79+ buf [r ] = '\0' ;
80+ fun (buf );
81+ } while (r == 255 );
82+
83+ closesocket (sockfd );
84+ WSACleanup ();
85+
86+ return ;
87+ }
88+
89+ void print_msg (char * str )
90+ {
91+ printf ("%s" , str );
92+ }
93+
94+ int main (int argc , char * argv [])
95+ {
96+ char str [MAXLINE ] = {0 };
97+
98+ if (argc < 2 )
99+ {
100+ printf ("usage: ./client message\n" );
101+ exit (0 );
102+ }
103+
104+ system ("chcp 65001" );
105+ request (argv [1 ], print_msg );
106+
107+ // FILE *fp = fopen("test.txt", "w");
108+ // fputs(str, fp);
109+ // fclose(fp);
110+
111+ return 0 ;
112+ }
0 commit comments