Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <errno.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <sys/wait.h>
- #include <iostream>
- using namespace std;
- #define PORT 7777
- extern int errno;
- void sighandler(int signo){
- if(signo == SIGCHLD){
- cout<<"[server-"<<getpid()<<"]Child terminated\n";
- while(waitpid(-1, NULL, WNOHANG)>0);
- }
- }
- int main()
- {
- struct sockaddr_in server;
- struct sockaddr_in from;
- string msg;
- string answer;
- char buf[1024];
- int n = 0;
- int sd;
- int optval = 1;
- //----->socket()
- if((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("[server]Socket() error.\n");
- return errno;
- }
- setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
- bzero(&server, sizeof(server));
- bzero(&from, sizeof(from));
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = htonl(INADDR_ANY);
- server.sin_port = htons(PORT);
- //---->bind()
- if(bind(sd, (struct sockaddr*) &server, sizeof(struct sockaddr)) ==-1)
- {
- perror("[server]Bind() error.\n");
- return errno;
- }
- //---->listen()
- if(listen(sd, 5) == -1)
- {
- perror("[server]Listen() error.\n");
- return errno;
- }
- cout<<"[server-"<<getpid()<<"]Waiting at the port "<<PORT<<endl;
- signal(SIGCHLD, SIG_IGN);
- while(1)
- {
- int client;
- socklen_t length = sizeof(from);
- int pid; //procesul copil
- char address[INET_ADDRSTRLEN]; // IP Client
- bzero(&from, sizeof(from));
- //---->accept()
- client=accept(sd, (struct sockaddr*) &from, &length);
- if(client<0)
- {
- perror("[server]Accept() error.\n");
- continue;
- }
- else
- {
- inet_ntop(AF_INET, &from.sin_addr.s_addr, address, INET_ADDRSTRLEN);
- cout<<"[server-"<<getpid()<<"]The client connected: ";
- cout<<address<<':'<<ntohs(from.sin_port)<<endl;
- }
- //---->fork()
- if((pid=fork())<0)
- {
- perror("fork() error");
- continue;
- }
- else if(pid ==0)
- {
- msg.empty();
- cout<<"[server-"<<getpid()<<"]Waiting a message...\n";
- bzero(buf, 500);
- while((n=recv(client, buf, sizeof(buf), 0))>0)
- {
- msg.append(buf, buf+n);
- }
- if(n<0)
- {
- cout<<"[server-"<<getpid()<<"]Read from client error.\n";
- close(client);
- continue;
- }
- cout<<"[server-"<<getpid()<<"]Message received: "<<msg<<endl;
- answer.empty();
- answer="Hello "+msg;
- cout<<"[server-"<<getpid()<<"]Sending message back..."<<answer<<endl;
- if(n = (send(client, answer.data(), answer.size(), 0))<0)
- {
- cout<<"[server-"<<getpid()<<"]Write to client error\n";
- continue;
- }
- else
- cout<<"[server-"<<getpid()<<"]Message successfully sent\n";
- close(client);
- exit(0);
- } /*fork()*/
- close(client);
- } /*while*/
- } /*main*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement