C, программирование сокетов: 1 сервер 2 клиентов, подключенных через HUB, приложение чата с использованием TCP - PullRequest
1 голос
/ 29 апреля 2011

У меня есть коды для подключения и общения между 1 сервером 1 клиентом следующим образом:

/*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;
}

Мне нужно подключить другого клиента, который также может общаться через тот же порт.Пожалуйста, дайте мне коды для этого.Спасибо.

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Вы должны разветвить логику программы вашего сервера после вызова fork().Один филиал связывается с клиентом, другому придется снова позвонить на прием.

Нет необходимости создавать новый процесс, вы также можете обрабатывать все соединения и процесс прослушивания с помощью функции select().Результат этой функции и результат макросов FD_ISSET будут указывать, какое соединение необходимо обработать или установить.

0 голосов
/ 03 января 2012

мы можем подключить более 1 клиента, используя поток в серверной программе.для этого нам нужно использовать файл заголовка pthread на сервере.

...