基于Linux下C/C++的网络编程之进程(对话)

在Linux下的C/C++的网络编程之进程中的对话。需要建立两个管道(pipe)。因为pipe是半双工的。简历两个pipe是为了伪装成全双工的pipe。
这里写图片描述

#pragma once  //这是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。

#pragma once是编译器相关的,就是说即使这个编译系统上有效,但在其他编译系统也不一定可以,不过现在基本上已经是每个编译器都有这个杂注了。

#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式.


在程序中由于对话用到了询问当前时间。所以介绍下time函数,
函数名称:     time 
函数原型:     time_t time(time_t *timer) 
函数功能:     得到机器的日历时间或者设置日历时间 
函数返回:     机器日历时间 
参数说明:     timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long类型 
所属文件:     <time.h> 
#include<time.h>
#include<stdio.h>
#include<dos.h>
int main()
{
    time_t t;//time_t *time
    t=time();
    printf("The Number of second since january 1,2016 is %ld",t);
    return 0;
}

c_time函数依赖于time函数
函数名称:     ctime 
函数原型:     char *ctime(long time) 
函数功能:     得到日历时间 
函数返回:     返回字符串格式:星期,月,日,小时:分:秒,年 
参数说明:     time-该参数应由函数time获得 
所属文件:     <time.h> 
#include<time.h>
#include<stdio.h>
#include<dos.h>
int main()
{
    time_t t;
    time(&t);
    printf("Today is data and time:%s",ctime(&t));
    return 0;
}


整体单独建立一个头文件mkdir  utili.h
vim utili.h进入头文件程序编写。


#include<iostream>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
using namespace std;

#define BUFFER_SIZE  256

const char *write_fifo = "write_fifo";
const char *read_fifo = "read_fifo";

在头文件的基础上建立新的文件mkdir pipe.cpp

#include<utili.h>

int main()
{
    const char *parent_talk[] = {"Hello!",
                                 "Can you tell me time current?",
                                 "I have to go ,Bye!",
                                 NULL
                                };
    const char *child_talk[] = {"Hi!",
                                "No problem!",
                                "Bye-bye!",
                                };
    int fd1[2];//文件描述符fd1
    int fd2[2];//文件描述符fd2
    int res = pipe(fd1);
    int res = pipe(fd2);
    if(res == -1)
    {
        perror("pipe1");
    }
    if(res == -1)
    {
        perror("pipe2");
    }       
    pid_t pid;//相当于size_t size ,即pid这个变量定义成pid_t类型。
if(pid == 0)
{
    char buffer[256];
    close(fd1[1]);//关闭管道1write,开启管道1read
    close(fd2[0]);//关闭管道2read,开启管道2write

    int i = 0 ;
    const char* talk = child_talk[i];
    while(talk != NULL)
    {
        read(fd1[0],buffer,256);
        printf("Parent :> %s\n",buffer);
        if(i == 1)
        {
            time_t t;
            time(&t);"%s:%s",talk,ctime(&t));
            write(fd2[1],buffer,strlen(buffer)+1);      
        }
        else
        {
            write(fd2[1],talk,strlen(talk)+1);
        }
        ++i;
        talk = child_talk[i];
    }
    close(fd1[0]);
    close(fd2[1]);
}
else if(pid > 0)
{
    char buffer[256];
    close(fd1[0]);//关闭父进程的读,
    close(fd2[1]);//关闭父进程的写,

    int i = 0;
    const char* talk = parent_talk[i];
    while(talk != NULL)
    {
        write(fd1[1],talk,strlen(talk)+1);
        read(fd2[0],buffer,256);
        printf("Child:> %s\n",buffer);
        ++i;
        talk = parent_talk[i];
        close(fd1[1]);关闭pipewrite
        close(fd2[0]);关闭piperead
        }
        int status;
        wait(&status);
}
return 0;
}

程序进行编译 g++ pipe.cpp -o pipe
./pipe
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值