Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/un.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <errno.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <string.h>
- #include <strings.h>
- #include <netdb.h>
- #include <signal.h>
- #define DEFAULT_PORT 80
- #define MAX_CONNECTIONS 20
- #define PAUSE_TIME_SEC 1
- #define BUFFER_SIZE 1000
- extern int errno;
- typedef struct sockaddr_in SocketAddress;
- static volatile sig_atomic_t keep_running = 1;
- static void sigHandler(int _)
- {
- keep_running = 0;
- }
- void setupSocketAddress(SocketAddress *socketAddress, int port)
- {
- socketAddress->sin_family = AF_INET;
- socketAddress->sin_addr.s_addr = htonl(INADDR_ANY);
- socketAddress->sin_port = htons(port);
- }
- void die(const char *message)
- {
- printf("%s\n", message);
- exit(1);
- }
- void sendHelloMessage(int connectionFileDescriptor)
- {
- // send hello message
- char helloMessage[] = "Hello from server\n";
- write(connectionFileDescriptor, helloMessage, sizeof(helloMessage));
- }
- void receiveFromClient(int connectionFileDescriptor)
- {
- char buff[BUFFER_SIZE];
- // read from client
- bzero(buff, BUFFER_SIZE);
- read(connectionFileDescriptor, buff, sizeof(buff));
- printf("From client:\n%s\n", buff);
- printf("Sending reply from client\n");
- }
- void sendReplyFromServer(int connectionFileDescriptor)
- {
- // send hello message
- char replyFromServer[] = "Reply from server\n";
- write(connectionFileDescriptor, replyFromServer, sizeof(replyFromServer));
- }
- void acceptClientMessage(int connectionFileDescriptor)
- {
- sendHelloMessage(connectionFileDescriptor);
- receiveFromClient(connectionFileDescriptor);
- sendReplyFromServer(connectionFileDescriptor);
- }
- int main(int argc, char *argv[])
- {
- int defaultPort = DEFAULT_PORT;
- SocketAddress socketAddress, cli;
- int socketFileDescriptor, socketBindOperation, socketListenOperation, connectionFileDescriptor;
- char buff[1000];
- socklen_t addrlen;
- int true = 1, forkID;
- // signal(SIGINT, sigHandler);
- if (argc > 1)
- {
- defaultPort = atoi(argv[1]);
- }
- socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0);
- if (socketFileDescriptor == -1)
- {
- die("Socket create failed");
- }
- setsockopt(socketFileDescriptor, SOL_SOCKET, SO_REUSEADDR, &true, sizeof(int));
- setupSocketAddress(&socketAddress, defaultPort);
- socketBindOperation = bind(socketFileDescriptor, (struct sockaddr *)&socketAddress, sizeof(socketAddress));
- if (socketBindOperation != 0)
- {
- printf("errno %d\n", errno);
- die("Socket bind failed...");
- }
- printf("Socket :%d binded...\n", defaultPort);
- socketListenOperation = listen(socketFileDescriptor, MAX_CONNECTIONS);
- if (socketListenOperation != 0)
- {
- die("Listen failed...\n");
- }
- printf("Server Listening...\n");
- // multiple connections
- //for (; keep_running;)
- while (keep_running)
- {
- addrlen = sizeof(cli);
- connectionFileDescriptor = accept(socketFileDescriptor, (struct sockaddr *)&cli, &addrlen);
- if (connectionFileDescriptor == -1)
- {
- die("Server accept failed...");
- }
- forkID = fork();
- // child process
- if (forkID == 0)
- {
- printf("Server accepted the client...\n");
- acceptClientMessage(connectionFileDescriptor);
- close(connectionFileDescriptor);
- printf("Server closed the connection\n");
- exit(0);
- }
- // parent process
- else{
- wait(NULL);
- }
- }
- // if it is parent
- if (forkID != 0)
- {
- close(socketFileDescriptor);
- printf("Closed %d\n", getpid());
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement