Más complicado instancias del servidor de procesos

    El programa es instancia de servidor concurrente de múltiples procesos. Incluyendo programas de servidor y cliente. Información compilada y ejecutada de la siguiente manera:

    Sistema operativo: 7 CentOS

    Herramientas de compilación: GCC

    Herramientas de depuración: BGF

    Realizar la función como sigue:

    1, se muestra el servidor de espera de la conexión del cliente Una vez que la dirección del cliente conectado, a continuación, reciben el nombre del cliente y se visualiza en la pantalla. A continuación, recibe información desde el cliente (cadena). Cada vez que recibe una cadena, lo muestra, y envía un mensaje "enviado con éxito" ( "enviado con éxito") clientes. Después de eso, seguimos a esperar la información al cliente hasta que el cliente cierra la conexión. El servidor tiene la capacidad de manejar múltiples clientes.

    2, el cliente se conecta por primera vez al servidor. Después de una conexión exitosa, mostrar información de una conexión exitosa. A continuación, el cliente recibe el nombre introducido por el usuario, y envía el nombre del programa servidor. Entonces recibe cadena de entrada del usuario, entonces la cadena se envía al servidor, el servidor recibe y envía la información del programa que se transmite con éxito. Después de eso, seguimos esperar a la entrada del usuario hasta que el usuario entra Ctrl + C. Cuando la entrada del usuario se recibe Ctrl + C, el cliente cierra la conexión y salidas.

 

    programa de servidor de la siguiente manera:

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

#define PORT    1234
#define BACKLOG 2
#define MAXDATASIZE 1000

void process_cli(int connectfd,struct sockaddr_in client);

int main()
{
        int listenfd,connectfd;
        pid_t pid;
        struct sockaddr_in server;
        struct sockaddr_in client;
        int sin_size;

        if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                perror("socket() error");
                exit(1);
        }

        bzero(&server,sizeof(server));
        server.sin_family=AF_INET;
        server.sin_port=htons(PORT);
        server.sin_addr.s_addr=htonl(INADDR_ANY);


        if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
        {
                perror("bind() error");
                exit(1);
        }

        if(listen(listenfd,BACKLOG)==-1)
        {
                perror("listen() error");
                exit(1);
        }

        sin_size=sizeof(struct sockaddr_in);

        while(1)
        {
                sin_size=sizeof(struct sockaddr_in);
                if((connectfd=accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1)
                {
                        perror("accept() error");
                        exit(1);
                }

                if((pid=fork())<0)
                {
                        printf("fork error\n");
                        exit(1);

                }
                else if(pid==0)
                {
                        close(listenfd);
                        process_cli(connectfd,client);
                        exit(0);
                }
                else
                {
                        close(connectfd);
                        continue;

                }
        }
        close(listenfd);
}

void process_cli(int connectfd, struct sockaddr_in client)
{
        int num,i;
        char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE],cli_name[MAXDATASIZE];

        printf("You got a connection from:%s.",inet_ntoa(client.sin_addr));
        num=recv(connectfd,cli_name,MAXDATASIZE,0);
        if(num==0)
        {
                close(connectfd);
                printf("client disconnected.\n");
                return;
        }

        cli_name[num-1]='\0';
        printf("Client's name is %s.\n",cli_name);

        while((num=recv(connectfd,recvbuf,MAXDATASIZE,0))>0)
        {
                recvbuf[num]='\0';
                printf("Received client (%s) message:%s",cli_name,recvbuf);

                send(connectfd,"sent successfully.\n",19,0);
        }
        close(connectfd);
}


El programa cliente es el siguiente:

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

#define PORT    1234
#define MAXDATASIZE     100

void process(FILE *fp,int socket);
char* getMessage(char* sendline,int len,FILE* fp);

int main(int argc,char *argv[])
{
        int fd;
        struct hostent *he;
        struct sockaddr_in server;

        if(argc!=2)
        {
                printf("Usage :%s  <IP Address>\n",argv[0]);
                exit(1);
        }

        if((he=gethostbyname(argv[1]))==NULL)
        {
                printf("gethostbyname() error.\n");
                exit(1);
        }

        if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                perror("socket() error");
                exit(1);
        }

        bzero(&server,sizeof(server));
        server.sin_port=htons(PORT);
        server.sin_family=AF_INET;
        server.sin_addr=*((struct in_addr *)he->h_addr);

        if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
        {
                perror("connect() error");
                exit(1);
        }

        process(stdin,fd);

        close(fd);
}

void process(FILE *fp,int sockfd)
{
        int numbytes;
        char recvline[MAXDATASIZE],sendline[MAXDATASIZE];
        printf("Connected to server.\n");
        printf("Input name :");
        if(fgets(sendline,MAXDATASIZE,fp)==NULL)
        {
                printf("\nExit.\n");
                return;
        }
        send(sockfd,sendline,strlen(sendline),0);

        while((getMessage(sendline,MAXDATASIZE,fp))!=NULL)
        {
                send(sockfd,sendline,strlen(sendline),0);
                if((numbytes=recv(sockfd,recvline,MAXDATASIZE,0))==0)
                {
                        printf("Server terminated.\n");
                        return;
                }
                recvline[numbytes]='\0';
                printf("Server Message :%s\n",recvline);
        }

        printf("\nExit.\n");
}

char *getMessage(char *sendline,int len,FILE *fp)
{
        printf("Input string to server:");
        return(fgets(sendline,MAXDATASIZE,fp));
}

programa de servidor que ejecuta resultados son los siguientes:

[root@mylinux 20160920]# ./srv
You got a connection from:127.0.0.1.Client's name is client1.
Received client (client1) message:1234
Received client (client1) message:abc
Received client (client1) message:efg
You got a connection from:127.0.0.1.Client's name is client2.
Received client (client2) message:12345667
Received client (client2) message:qazwsx
Received client (client1) message:123abcd

El cliente se ejecuta 1 resultados son los siguientes:

[root@mylinux 20160920]# ./cli 127.0.0.1
Connected to server.
Input name :client1
Input string to server:1234
Server Message :sent successfully.

Input string to server:abc
Server Message :sent successfully.

Input string to server:efg
Server Message :sent successfully.

Input string to server:123abcd
Server Message :sent successfully.

Input string to server:
Exit.


Client 2 resultados son los siguientes:

[root@mylinux 20160920]# ./cli 127.0.0.1
Connected to server.
Input name :client2
Input string to server:12345667
Server Message :sent successfully.

Input string to server:qazwsx
Server Message :sent successfully.

Input string to server:
Exit.

 

Publicado 48 artículos originales · alabanza won 65 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/xiaolong361/article/details/52627983
Recomendado
Clasificación