0

My socket server program is mentioned below. It works fine with the single client but when I try to connect it with another client at the same time, I am unable to connect. But I have defined MAX_CLIENTS in my program as 2 but still why I am unable to connect with multiple clients? What is the correct process to connect with multiple client? Will I be able to connect with multiple client by modifying this code? Any possible fix?

Socket Server Code:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <error.h>
#include <strings.h>
#include <unistd.h>
#include <arpa/inet.h>

#define ERROR -1
#define MAX_CLIENTS 2
#define MAX_DATA 1024




main (int argc, char **argv){


    struct sockaddr_in server;
    struct sockaddr_in client;
    int sock;
    int new;
    int sockaddr_len = sizeof (struct sockaddr_in);
    int data_len;
    char data [MAX_DATA];


    if ((sock = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {

        perror ("socket: ");
        exit (-1);

    }   
    printf("after socket");
    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(argv[2]));
    server.sin_addr.s_addr = INADDR_ANY;
    bzero (&server.sin_zero, 8);
    printf("after server");


    if ((bind (sock, (struct sockaddr*)&server, sockaddr_len)) == -1)
    {
        perror  ("bind");
        exit (-1);

    }
    printf("after bind");
    if ((listen(sock, MAX_CLIENTS)) == ERROR)
    {
        perror ("listen");
        exit (-1);  

    }
    printf("after listen");

    while(1)

    {
        if ((new = accept(sock, (struct sockaddr*)&client, &sockaddr_len)) == ERROR)
        {


            perror ("accept");
            exit (-1);

        }

            printf("after new");
            printf("New client connected from port no %d and IP %s\n",ntohs(client.sin_port), inet_ntoa(client.sin_addr));
            data_len = 1;
            while (data_len)
                {
                    data_len = recv (new, data, MAX_DATA, 0);
                    if (data_len) 
                    {
                        send (new, data, data_len, 0)   ;
                        data [data_len]='\0';
                        printf("Sent mesg: %s", data);
                    }
                    printf("after datalen");
                }
                printf("Client Disconnected\n");
                close(new);
        }
        printf("after close new");
        close (sock);

    } 
user3751012
  • 533
  • 1
  • 8
  • 20
  • BTW: `data [data_len]='\0';` will write beyond data[] if data_len happens to be equal to MAX_DATA. – joop Jun 27 '14 at 11:34
  • @user3751012, You can use select for handling multiple client to accept and do something when client request, you can also use fork to handling the single client for the single process to do client and server job continuously. – Chandru Jun 27 '14 at 12:28

1 Answers1

6

Your program is single-threaded, and only does one thing at a time. When you have accepted a socket connection from a client (in your outer while loop) you start communicating with that client (in your inner while loop), and you don't get back to the accept call until the first client has disconnected.

Either use threads, with one thread that waits for new connections and one additional thread for each client, waiting for input from that client, or use the select call, which lets you wait for input simultaneously from several different sources.

Thomas Padron-McCarthy
  • 27,232
  • 8
  • 51
  • 75
  • 2
    A third alternative is to fork off a separate process for each connected client. – alk Jun 27 '14 at 12:02