Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <signal.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/un.h>
- #include <string>
- #include <fstream>
- #include <iostream>
- using namespace std;
- const int BUFFER_SIZE = 1024;
- struct sockaddr_in serv_addr;
- struct sockaddr_in cli_addr;
- int sockInet; //Socket
- int newSockInet; //New socket descriptor
- string findWords(string words, string fileName) {
- ifstream inputFile(fileName.c_str());
- string line;
- string result = "";
- while (getline(inputFile, line)) {
- if (line.find(words) != string::npos) {
- result.append(line);
- result.append("\n");
- }
- }
- inputFile.close();
- return result;
- }
- string acceptString(string socketName){
- int sockfd, servlen,n;
- struct sockaddr_un serv_addr;
- bzero((char *)&serv_addr,sizeof(serv_addr));
- serv_addr.sun_family = AF_UNIX;
- socketName.copy(serv_addr.sun_path, socketName.size());
- servlen = strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);
- if ((sockfd = socket(AF_UNIX, SOCK_STREAM,0)) < 0)
- printf("Error creating socket client\n");
- while (true) {
- if (connect(sockfd, (struct sockaddr *) &serv_addr, servlen) >= 0)
- break;
- }
- char buffer[BUFFER_SIZE];
- n=read(sockfd, buffer, BUFFER_SIZE);
- close(sockfd);
- shutdown(sockfd,1);
- return string(buffer);
- }
- void sendString(string socketName, string toSend) {
- int sockfd, newsockfd, servlen;
- socklen_t clilen;
- struct sockaddr_un cli_addr, serv_addr;
- if ((sockfd = socket(AF_UNIX,SOCK_STREAM,0)) < 0)
- printf("error on creating socket Server \n");
- bzero((char *) &serv_addr, sizeof(serv_addr));
- serv_addr.sun_family = AF_UNIX;
- socketName.copy(serv_addr.sun_path, socketName.size());
- servlen=strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);
- if(bind(sockfd,(struct sockaddr *)&serv_addr,servlen)<0)
- printf("error on binding socket Server \n");
- listen(sockfd,5);
- clilen = sizeof(cli_addr);
- newsockfd = accept(sockfd,(struct sockaddr *)&cli_addr,&clilen);
- if (newsockfd < 0)
- printf("error accepting Server \n");
- const char* buffer = toSend.c_str();
- char newBuffer[BUFFER_SIZE];
- strcpy(newBuffer, buffer);
- newBuffer[toSend.size()] = '\0';
- int n = write(newsockfd, newBuffer, toSend.size()+1);
- shutdown(newsockfd,1);
- close(newsockfd);
- shutdown(sockfd,1);
- close(sockfd);
- }
- void work(string socketName, string words, string fileName) {
- string found = findWords(words, fileName);
- sendString(socketName, found);
- }
- int main(int argc, char* argv[]){
- //Create and check socket
- sockInet = socket(AF_INET, SOCK_STREAM, 0);
- if (sockInet < 0) {
- fprintf(stderr, "Server: ERROR opening socket\n");
- return 0;
- }
- //Setting up sockaddr
- serv_addr.sin_family = AF_INET; //Set adress family
- serv_addr.sin_port = htons(8000); //Convert and set port
- serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //Connect to any
- if (bind(sockInet, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
- fprintf(stderr, "Server: ERROR on binding\n");
- return 0;
- }
- //Set socket to listen state
- listen(sockInet, 1);
- //Accept connection
- socklen_t clilen = sizeof(cli_addr);
- newSockInet = accept(sockInet,(struct sockaddr *) &cli_addr, &clilen);
- if (newSockInet < 0) {
- fprintf(stderr, "Server: ERROR connecting\n");
- return 0;
- } else {
- fprintf(stdout, "Server: Client connected\n");
- }
- char buf[BUFFER_SIZE];
- bzero(buf, BUFFER_SIZE);
- int count = read(newSockInet, buf, BUFFER_SIZE);
- string wordToFind = string(buf).substr(0, count - 1);
- fprintf(stdout, "Server: String accepted \"%s\"\n", wordToFind.c_str());
- if (fork() == 0) { //Worker1
- work("socket1", wordToFind, "file1.txt");
- } else {
- if (fork() == 0) { //Worker2
- work("socket2", wordToFind, "file2.txt");
- } else {
- if (fork() == 0) { //Worker3
- work("socket3", wordToFind, "file3.txt");
- } else { //Parent
- string result = acceptString("socket1");
- result.append(acceptString("socket2"));
- result.append(acceptString("socket3"));
- const char* buffer = result.c_str();
- char newBuffer[BUFFER_SIZE];
- strcpy(newBuffer, buffer);
- newBuffer[result.size()] = '\0';
- int n = write(newSockInet, newBuffer, result.size() + 1);
- shutdown(newSockInet, SHUT_RDWR);
- shutdown(sockInet, SHUT_RDWR);
- close(newSockInet);
- close(sockInet);
- }
- }
- }
- remove("socket1");
- remove("socket2");
- remove("socket3");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement