Skip to content

Commit 23c0038

Browse files
committed
add socket
1 parent 5ad86ee commit 23c0038

File tree

7 files changed

+1835
-0
lines changed

7 files changed

+1835
-0
lines changed

c/socket/client.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
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+
}

c/socket/server.c

Whitespace-only changes.

c/socket/server_socket.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from socket import *
2+
import ujson as json
3+
4+
5+
res = "HTTP/1.1 200 OK\r\n\r\n" + json.dumps({'code': 200})
6+
7+
def main():
8+
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
9+
tcp_server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
10+
11+
tcp_server_socket.bind(("0.0.0.0", 8000))
12+
tcp_server_socket.listen(128)
13+
14+
while True:
15+
16+
new_client, client_addr = tcp_server_socket.accept()
17+
print(client_addr)
18+
19+
recv_data = new_client.recv(1024)
20+
print(recv_data.decode())
21+
22+
new_client.send(res.encode())
23+
24+
new_client.close()
25+
tcp_server_socket.close()
26+
27+
28+
if __name__ == "__main__":
29+
main()

c/socket/test.cpp

Whitespace-only changes.

0 commit comments

Comments
 (0)