linux下使用管道实现一个简单的服务器/客户端

原创 2015年11月20日 16:42:10

直接上源码
首先是用到的数据结构和头文件的声明和定义

//包含客户端和服务器程序都会用到的数据结构等。为了方便使用,
//也包含了必要的系统头文件

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<limits.h>
#include<sys/types.h>
#include<sys/stat.h>

#define SERVER_FIFO_NAME "/tmp/serv_fifo"
#define CLIENT_FIFO_NAME "/tmp/cli_%d_fifo"

#define BUFFER_SIZE 20

struct data_to_pass_st{
    pid_t client_pid;
    char some_data[BUFFER_SIZE + 1];
};

服务器端的代码:

#include <iostream>
#include"client.h"
#include<ctype.h>

using namespace std;

//在服务器程序中,我们创建并打开服务器管道.被设置为只读的阻塞模式
//在稍作袖子后,服务器开始读取客户端发来的数据,这些数据是采用data_to_pass_st结构

int main()
{

    int server_fifo_fd , client_fifo_fd;
    struct data_to_pass_st my_data;
    int read_res;
    char client_fifo[256];
    char* tmp_char_ptr;

    mkfifo(SERVER_FIFO_NAME , 0777);
    server_fifo_fd  = open(SERVER_FIFO_NAME , O_RDONLY);


    if(server_fifo_fd == -1)
    {
        fprintf( stderr, "Server fifo failure\n");
        exit(EXIT_FAILURE);
    }

    sleep(10);

    do{
        read_res = read(server_fifo_fd , &my_data , sizeof(my_data));
        if(read_res > 0){
            tmp_char_ptr = my_data.some_data;
            while(*tmp_char_ptr){
            //对从客户端读取到的数据进行处理,把some_data中的左右字符全部转化为大写,并且把CLIENT——FIFO——NAME 和client_pid结合到一起
                *tmp_char_ptr = toupper(*tmp_char_ptr);
                tmp_char_ptr++;
            }
            sprintf(client_fifo , CLIENT_FIFO_NAME , my_data.client_pid);

            //以只写的方式打开客户通道,把经过处理的数据发送出去。最后,关闭服务器管道文件的文件描述符,删除FIFO文件,退出程序

            client_fifo_fd = open(client_fifo , O_WRONLY);
            if(client_fifo_fd != -1){
                write(client_fifo_fd , &my_data , sizeof(my_data));
                close(client_fifo_fd);
            }

        }

    }while(read_res > 0);


    close(server_fifo_fd);
    unlink(SERVER_FIFO_NAME);
    exit(EXIT_SUCCESS);

    //return 0;
}

客户端的代码:

#include"client.h"
#include<ctype.h>

int main(){
    int server_fifo_fd , client_fifo_fd;
    struct data_to_pass_st my_data;
    int times_to_send;
    char client_fifo[256];

    server_fifo_fd = open(SERVER_FIFO_NAME , O_WRONLY);
    if(server_fifo_fd == -1){
        fprintf(stderr , "Sorry , no server!\n");
        exit(EXIT_FAILURE);
    }


    my_data.client_pid  = getpid();
    sprintf(client_fifo , CLIENT_FIFO_NAME , my_data.client_pid);
    if(mkfifo(client_fifo , 0777) == -1){
        fprintf(stderr , "Sorry , Can't make %s\n" , client_fifo);
        exit(EXIT_FAILURE);
    }

    //这部分有5次循环,在每次循环中,客户将数据发送给服务器,然后打开客户FIFO(只读,阻塞模式)b并读回数据。在程序的最后,关闭服务器FIFO并将客户端的FIFO文件从系统中删除
    for(times_to_send = 0 ; times_to_send < 5 ; times_to_send++){

        sprintf(my_data.some_data , "Hello from %d" , my_data.client_pid);
        printf("%d sent %s" , my_data.client_pid , my_data.some_data);
        write(server_fifo_fd , &my_data , sizeof(my_data));
        client_fifo_fd  = open(client_fifo , O_RDONLY);
        if(client_fifo_fd != -1){
            if(read(client_fifo_fd , &my_data , sizeof(my_data))  > 0){
                printf("received: %s\n" , my_data.some_data);
            }
            close(client_fifo_fd);
        }
    }

close(server_fifo_fd);
unlink(client_fifo);
exit(EXIT_SUCCESS);

}

linux程序设计——使用FIFO的客户/服务器的应用程序(第十三章)

13.6.2    使用FIFO的客户/服务器应用程序 作为学习FIFO的最后一部分内容,现在考虑怎样通过命名管道来编写一个非常简答的客户/服务器应用程序。用一个服务器进程来接受请求,对它们进行处理...
  • yiranant
  • yiranant
  • 2015年07月15日 23:33
  • 609

Linux c实现一个tcp文件服务器和客户端

总体需求: 编写tcp文件服务器和客户端。客户端可以上传和下载文件。 ================================================ 分解需求 ...
  • w5897093
  • w5897093
  • 2014年08月10日 14:06
  • 2488

[计网] 用python语言开发一个简单的web服务器和客户端

服务器:      当客户联系时创建一个连接套接字      从这个连接接收HTTP请求(*)      解释该请求所请求的特定文件      从服务器的文件系统获取该文件      并发送文件内容...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016年05月26日 17:01
  • 3709

用C语言实现的简单Web服务器(Linux)

转自 http://blog.chinaunix.net/uid-22568683-id-84698.html 相信大家对Apache都有所听闻,Apache是目前使用最为广泛我Web服务器。大家可...
  • lqxandroid2012
  • lqxandroid2012
  • 2016年04月05日 21:06
  • 747

Linux下网络socket编程——实现服务器(select)与多个客户端通信

一、关于socket通信服务器端工作流程: 调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定 调用listen()函数监听socket() 函数创建的套...
  • qicheng777
  • qicheng777
  • 2017年06月23日 14:44
  • 803

使用 Socket 通信实现 FTP 客户端程序

转载: http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/index.html#FTP 简介: FTP 客户端如 FlashFX...
  • luliyuan
  • luliyuan
  • 2016年08月26日 09:24
  • 6707

UDP简单实现并发服务器和客户端简单通信

以下程序均未做错误处理,以后有时间一定补上 客户端 #include #include #include #include #include int main(int argc,cha...
  • goodman_lqifei
  • goodman_lqifei
  • 2016年12月05日 22:20
  • 587

linux下socket实现多个客户端与服务器的通信

学习完《UNIX环境高级编程》套接字一章的内容之后,自己实现了单个客户端与服务器的通信程序,后面想想要是多个客户端如何与服务器通信呢?这就有了这篇文章。 这里采用的是用多线程实现多客户端与服务器的通...
  • wdlove58
  • wdlove58
  • 2016年09月25日 13:30
  • 3168

SuperSocket服务器架设(二):使用SuperSocket构建简单服务器

服务器效果截图:   客户端效果截图:   1.      创建控制台项目,导入SuperSocket.Common、SuperSocket.SocketBas...
  • u011470119
  • u011470119
  • 2014年09月22日 22:21
  • 3727

Java中利用socket实现简单的服务端与客户端的通信(入门级)

Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍。首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特...
  • qq_25352981
  • qq_25352981
  • 2015年11月19日 18:15
  • 4281
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下使用管道实现一个简单的服务器/客户端
举报原因:
原因补充:

(最多只允许输入30个字)