-
Notifications
You must be signed in to change notification settings - Fork 1
/
proxy.c
160 lines (160 loc) · 5.29 KB
/
proxy.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <sys/socket.h>
#include <sys/types.h>
#include <resolv.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include<unistd.h>
#include<netdb.h> //hostent
#include<arpa/inet.h>
int hostname_to_ip(char * , char *);
// client will connect to server using given IP and port
struct serverInfo
{
int client_fd;
char ip[100];
char port[100];
};
// A thread function
void *runSocket(void *vargp)
{
struct serverInfo *info = (struct serverInfo *)vargp;
char buffer[65535];
int bytes =0;
printf("client:%d\n",info->client_fd);
fputs(info->ip,stdout);
fputs(info->port,stdout);
//code to connect to main server via this proxy server
int server_fd =0;
struct sockaddr_in server_sd;
// create a socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if(server_fd < 0)
{
printf("server socket not created\n");
}
printf("server socket created\n");
memset(&server_sd, 0, sizeof(server_sd));
// set socket variables
server_sd.sin_family = AF_INET;
server_sd.sin_port = htons(atoi(info->port));
server_sd.sin_addr.s_addr = inet_addr(info->ip);
//connect to main server from this proxy server
if((connect(server_fd, (struct sockaddr *)&server_sd, sizeof(server_sd)))<0)
{
printf("server connection not established");
}
printf("server socket connected\n");
while(1)
{
//receive data from client
memset(&buffer, '\0', sizeof(buffer));
bytes = read(info->client_fd, buffer, sizeof(buffer));
if(bytes <= 0)
{
}
else
{
// send data to main server
write(server_fd, buffer, sizeof(buffer));
//printf("client fd is : %d\n",c_fd);
printf("From client :\n");
fputs(buffer,stdout);
fflush(stdout);
}
//recieve response from server
memset(&buffer, '\0', sizeof(buffer));
bytes = read(server_fd, buffer, sizeof(buffer));
if(bytes <= 0)
{
}
else
{
// send response back to client
write(info->client_fd, buffer, sizeof(buffer));
printf("From server :\n");
fputs(buffer,stdout);
}
};
return NULL;
}
// main entry point
int main(int argc,char *argv[])
{
pthread_t tid;
char port[100],ip[100];
char *hostname = argv[1];
char proxy_port[100];
// accept arguments from terminal
strcpy(ip,argv[1]); // server ip
strcpy(port,argv[2]); // server port
strcpy(proxy_port,argv[3]); // proxy port
//hostname_to_ip(hostname , ip);
printf("server IP : %s and port %s" , ip,port);
printf("proxy port is %s",proxy_port);
printf("\n");
//socket variables
int proxy_fd =0, client_fd=0;
struct sockaddr_in proxy_sd;
// add this line only if server exits when client exits
signal(SIGPIPE,SIG_IGN);
// create a socket
if((proxy_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\nFailed to create socket");
}
printf("Proxy created\n");
memset(&proxy_sd, 0, sizeof(proxy_sd));
// set socket variables
proxy_sd.sin_family = AF_INET;
proxy_sd.sin_port = htons(atoi(proxy_port));
proxy_sd.sin_addr.s_addr = INADDR_ANY;
// bind the socket
if((bind(proxy_fd, (struct sockaddr*)&proxy_sd,sizeof(proxy_sd))) < 0)
{
printf("Failed to bind a socket");
}
// start listening to the port for new connections
if((listen(proxy_fd, SOMAXCONN)) < 0)
{
printf("Failed to listen");
}
printf("waiting for connection..\n");
//accept all client connections continuously
while(1)
{
client_fd = accept(proxy_fd, (struct sockaddr*)NULL ,NULL);
printf("client no. %d connected\n",client_fd);
if(client_fd > 0)
{
//multithreading variables
struct serverInfo *item = malloc(sizeof(struct serverInfo));
item->client_fd = client_fd;
strcpy(item->ip,ip);
strcpy(item->port,port);
pthread_create(&tid, NULL, runSocket, (void *)item);
sleep(1);
}
}
return 0;
}
int hostname_to_ip(char * hostname , char* ip)
{
struct hostent *he;
struct in_addr **addr_list;
int i;
if ( (he = gethostbyname( hostname ) ) == NULL)
{
// get the host info
herror("gethostbyname");
return 1;
}
addr_list = (struct in_addr **) he->h_addr_list;
for(i = 0; addr_list[i] != NULL; i++)
{
//Return the first one;
strcpy(ip , inet_ntoa(*addr_list[i]) );
return 0;
}
return 1;
}