/* A simple server in the internet domain using TCP
The port number is passed as an argument */
/*proxy.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define BUFFER_SIZE 256
void error(const char *msg)
{
perror(msg);
exit(1);
}
void sendMessage(const char* msg, const char* address, const char* port){
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
fprintf(stderr, "sendMessage()1: %s\n", msg);
portno = atoi(port);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
fprintf(stderr, "sendMessage()2: %s\n", msg);
if(sockfd < 0) error("ERRPR opening socket");
server = gethostbyname(address);
if(server == NULL){
fprintf(stderr, "ERROR, no such host\n");
exit(0);
}
fprintf(stderr, "sendMessage()3: %s\n", msg);
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
fprintf(stderr, "sendMessage()4: %s port:%d\n", msg, portno);
if(connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR connecting");
n = write(sockfd, msg, strlen(msg));
if(n < 0) error("ERROR writing to socket");
close(sockfd);
fprintf(stderr, "sendMessage()5: %s\n", msg);
return;
}
void receiveMessage(const char* port, char* buffer){
int sockfd, newsockfd, portno;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
int n;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(port);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd, 5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,BUFFER_SIZE);
n = read(newsockfd,buffer,BUFFER_SIZE - 1);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
n = write(newsockfd, "I got your message", 18);
if(n < 0) error("ERROR writing to socket");
close(newsockfd);
close(sockfd);
}
int main(int argc, char *argv[])
{
char buffer[BUFFER_SIZE];
if (argc < 3) {
fprintf(stderr,"usage %s portToListenOn addressToForwardTo\n", argv[0]);
exit(0);
}
while(1){
receiveMessage(argv[1], buffer);
sendMessage(buffer, argv[3], argv[2]);
}
return 0;
}
LyogQSBzaW1wbGUgc2VydmVyIGluIHRoZSBpbnRlcm5ldCBkb21haW4gdXNpbmcgVENQCiAgIFRoZSBwb3J0IG51bWJlciBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgKi8KICAgLypwcm94eS5jKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxuZXRkYi5oPgoKI2RlZmluZSBCVUZGRVJfU0laRSAyNTYKCnZvaWQgZXJyb3IoY29uc3QgY2hhciAqbXNnKQp7CiAgICBwZXJyb3IobXNnKTsKICAgIGV4aXQoMSk7Cn0KCnZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgY2hhciogbXNnLCBjb25zdCBjaGFyKiBhZGRyZXNzLCBjb25zdCBjaGFyKiBwb3J0KXsKICAgIGludCBzb2NrZmQsIHBvcnRubywgbjsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2X2FkZHI7CiAgICBzdHJ1Y3QgaG9zdGVudCAqc2VydmVyOwoKCWZwcmludGYoc3RkZXJyLCAic2VuZE1lc3NhZ2UoKTE6ICVzXG4iLCBtc2cpOwoKCXBvcnRubyA9IGF0b2kocG9ydCk7Cglzb2NrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwoJZnByaW50ZihzdGRlcnIsICJzZW5kTWVzc2FnZSgpMjogJXNcbiIsIG1zZyk7CglpZihzb2NrZmQgPCAwKSBlcnJvcigiRVJSUFIgb3BlbmluZyBzb2NrZXQiKTsKCglzZXJ2ZXIgPSBnZXRob3N0YnluYW1lKGFkZHJlc3MpOwoJaWYoc2VydmVyID09IE5VTEwpewoJCWZwcmludGYoc3RkZXJyLCAiRVJST1IsIG5vIHN1Y2ggaG9zdFxuIik7CgkJZXhpdCgwKTsKCX0KCWZwcmludGYoc3RkZXJyLCAic2VuZE1lc3NhZ2UoKTM6ICVzXG4iLCBtc2cpOwoKCWJ6ZXJvKChjaGFyICopJnNlcnZfYWRkciwgc2l6ZW9mKHNlcnZfYWRkcikpOwoJc2Vydl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJYmNvcHkoKGNoYXIgKilzZXJ2ZXItPmhfYWRkciwgKGNoYXIgKikmc2Vydl9hZGRyLnNpbl9hZGRyLnNfYWRkciwgc2VydmVyLT5oX2xlbmd0aCk7CglzZXJ2X2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0bm8pOwoJZnByaW50ZihzdGRlcnIsICJzZW5kTWVzc2FnZSgpNDogJXMgIHBvcnQ6JWRcbiIsIG1zZywgcG9ydG5vKTsKCglpZihjb25uZWN0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2Vydl9hZGRyLCBzaXplb2Yoc2Vydl9hZGRyKSkgPCAwKQoJCWVycm9yKCJFUlJPUiBjb25uZWN0aW5nIik7CgkKCW4gPSB3cml0ZShzb2NrZmQsIG1zZywgc3RybGVuKG1zZykpOwoJaWYobiA8IDApIGVycm9yKCJFUlJPUiB3cml0aW5nIHRvIHNvY2tldCIpOwoJY2xvc2Uoc29ja2ZkKTsKCglmcHJpbnRmKHN0ZGVyciwgInNlbmRNZXNzYWdlKCk1OiAlc1xuIiwgbXNnKTsKCglyZXR1cm47Cn0KCgoKdm9pZCByZWNlaXZlTWVzc2FnZShjb25zdCBjaGFyKiBwb3J0LCBjaGFyKiBidWZmZXIpewoJaW50IHNvY2tmZCwgbmV3c29ja2ZkLCBwb3J0bm87Cglzb2NrbGVuX3QgY2xpbGVuOwoJc3RydWN0IHNvY2thZGRyX2luIHNlcnZfYWRkciwgY2xpX2FkZHI7CglpbnQgbjsKCXNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CglpZiAoc29ja2ZkIDwgMCkgCgkJZXJyb3IoIkVSUk9SIG9wZW5pbmcgc29ja2V0Iik7CgliemVybygoY2hhciAqKSAmc2Vydl9hZGRyLCBzaXplb2Yoc2Vydl9hZGRyKSk7Cglwb3J0bm8gPSBhdG9pKHBvcnQpOwoJc2Vydl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJc2Vydl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CglzZXJ2X2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0bm8pOwoJaWYgKGJpbmQoc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2X2FkZHIsIHNpemVvZihzZXJ2X2FkZHIpKSA8IDApCgkJZXJyb3IoIkVSUk9SIG9uIGJpbmRpbmciKTsKCglsaXN0ZW4oc29ja2ZkLCA1KTsKCWNsaWxlbiA9IHNpemVvZihjbGlfYWRkcik7CgkKCW5ld3NvY2tmZCA9IGFjY2VwdChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNsaV9hZGRyLCAmY2xpbGVuKTsKCWlmIChuZXdzb2NrZmQgPCAwKSAKCQllcnJvcigiRVJST1Igb24gYWNjZXB0Iik7CgliemVybyhidWZmZXIsQlVGRkVSX1NJWkUpOwoJbiA9IHJlYWQobmV3c29ja2ZkLGJ1ZmZlcixCVUZGRVJfU0laRSAtIDEpOwoKCWlmIChuIDwgMCkgZXJyb3IoIkVSUk9SIHJlYWRpbmcgZnJvbSBzb2NrZXQiKTsKCXByaW50ZigiSGVyZSBpcyB0aGUgbWVzc2FnZTogJXNcbiIsYnVmZmVyKTsKCQoJbiA9IHdyaXRlKG5ld3NvY2tmZCwgIkkgZ290IHlvdXIgbWVzc2FnZSIsIDE4KTsKCWlmKG4gPCAwKSBlcnJvcigiRVJST1Igd3JpdGluZyB0byBzb2NrZXQiKTsKCWNsb3NlKG5ld3NvY2tmZCk7CgljbG9zZShzb2NrZmQpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CgljaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV07CiAgICBpZiAoYXJnYyA8IDMpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCJ1c2FnZSAlcyBwb3J0VG9MaXN0ZW5PbiBhZGRyZXNzVG9Gb3J3YXJkVG9cbiIsIGFyZ3ZbMF0pOwogICAgICAgZXhpdCgwKTsKICAgIH0KCXdoaWxlKDEpewoJCXJlY2VpdmVNZXNzYWdlKGFyZ3ZbMV0sIGJ1ZmZlcik7CgkJc2VuZE1lc3NhZ2UoYnVmZmVyLCBhcmd2WzNdLCBhcmd2WzJdKTsKCX0KCXJldHVybiAwOyAKfQo=