1

I have codes for connecting and Chatting between 1 Server 1 Client as follows:

/*Server Side*/

#include<stdio.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>

main()
{
    int sd,i,len,bi,nsd,port;
    char content[30];
    struct sockaddr_in ser,cli;

    if((sd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
    {
        printf("\nSocket problem");
        return 0;
    }

    printf("\nSocket created\n");
    bzero((char*)&cli,sizeof(ser));
    printf("ENTER PORT NO:\n");
    scanf("%d",&port);
    printf("\nPort Address is %d\n:",port);
    ser.sin_family=AF_INET;
    ser.sin_port=htons(port);
    ser.sin_addr.s_addr=htonl(INADDR_ANY);
    bi=bind(sd,(struct sockaddr *)&ser,sizeof(ser));

    if(bi==-1)
    {
        printf("\nBind error, Port busy, Plz change port in client and server");
        return 0;
    }

    i=sizeof(cli);
    listen(sd,5);
    nsd = accept(sd,((struct sockaddr *)&cli),&i);

    if(nsd==-1)
    {
        printf("\nCheck the description parameter\n");
        return 0;
    }

    printf("\nConnection accepted!");

    if(fork())
    {
        printf("\nEnter the data to be send type exit for stop:\n");
        scanf("%s",content);

        while(strcmp(content,"exit")!=0)
        {
            send(nsd,content,30,0);
            scanf("%s",content);
        }

        send(nsd,"exit",5,0);
    }
    else
        i = recv(nsd,content,30,0);

    while(strcmp(content,"exit")!=0)
    {
        printf("\nClient: %s\n",content);
        i=recv(nsd,content,30,0);
    }

    printf("\nBye");
    send(nsd,"Offline",10,0);
    close(sd);
    close(nsd);
    return 0;
}

/*Client Side*/

#include<stdio.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
    int sd,con,port,i,Res;
    char content[30];
    struct sockaddr_in cli;

    if((sd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
    {
        printf("\nSocket problem");
        return 0;
    }

    bzero((char*)&cli,sizeof(cli));
    cli.sin_family = AF_INET;
    printf("ENTER PORT NO:\n");
    scanf("%d",&port);
    cli.sin_port=htons(port);
    cli.sin_addr.s_addr=htonl(INADDR_ANY);

    con=connect(sd,(struct sockaddr*)&cli,sizeof(cli));

    if(con==-1)
    {
        printf("\nConnection error");
        return 0;
    }

    if(fork())
    {
        printf("\nEnter the data to be send type exit for stop:\n");
        scanf("%s",content);

        while(strcmp(content,"exit")!=0)
        {
            send(sd,content,30,0);
            scanf("%s",content);
        }
        send(sd,"exit",5,0);
    }
    else
    {
        i=recv(sd,content,30,0);

        while(strcmp(content,"exit")!=0)
        {
            printf("\nServer: %s\n",content);
            i=recv(sd,content,30,0);
        }
        send(sd,"exit",5,0);
    }
    close(sd);
    return 0;
}

I need to connect another client which can also chat using the same port. Please give me codes to do that. Thank You.

harper
  • 13,345
  • 8
  • 56
  • 105
Arindam
  • 33
  • 1
  • 1
  • 5
  • 1
    What have you tried by yourself to solve your problem? Please do some code-indentation next time. Read [Beej's Guide to Network Programming](http://beej.us/guide/bgnet/), if you didn't yet. – Sebastian Apr 29 '11 at 06:16
  • Thanks for reply! I am New in Linux Socket Programming. So Please help me! – Arindam Apr 29 '11 at 06:19
  • 1
    Server never initiates a connect to the client. Client can connect to a server. Your program is looking good. You can run a single server,try to run multiple clients and each client connects to the server. Please explain clearly whats the problem that you are facing? –  Apr 29 '11 at 10:56
  • This server sample can only accept one client, because it calls `accept()` only once. One way to allow multiple clients, is that a process must be `fork()`ed after the `accept()`, and the `accept()` must be restarted for the next client. Like it is here, the second client will block in its `connect()` call. – philfr Apr 29 '11 at 11:29
  • This seems like a "gimme teh codes" question. Actually, it is. – MD XF Oct 28 '16 at 04:36

2 Answers2

1

You must fork your server's program logic after calling fork(). One branch communicates with the client, the other will have to call accept again.

There is no need to spawn a new process, you can also handle all connections as well as the listen process with the select() function. The result of that function and the result of the FD_ISSET macros will indicate, which connection needs to be handled or established.

harper
  • 13,345
  • 8
  • 56
  • 105
0

we can connect more than 1 client using thread in server program. for that we need to use pthread header file in server.

aathi
  • 9
  • 1