C,套接字编程:1个服务器2客户端通过HUB连接,聊天应用程序使用TCP

时间:2011-04-29 05:57:20

标签: c sockets tcp clients

我有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 个答案:

答案 0 :(得分:1)

调用fork()后,您必须分叉服务器的程序逻辑。一个分支与客户端通信,另一个分支必须再次呼叫接受。

无需生成新进程,您还可以使用select()函数处理所有连接以及侦听进程。该函数的结果和FD_ISSET宏的结果将指示需要处理或建立哪个连接。

答案 1 :(得分:0)

我们可以在服务器程序中使用线程连接多个客户端。为此,我们需要在服务器中使用pthread头文件。