您的位置:首页 > 理论基础 > 计算机网络

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

2016-09-06 15:49 495 查看
在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]);//关闭管道1的write,开启管道1的read
close(fd2[0]);//关闭管道2的read,开启管道2的write

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]);关闭pipe的write
close(fd2[0]);关闭pipe的read
}
int status;
wait(&status);
}
return 0;
}


程序进行编译 g++ pipe.cpp -o pipe

./pipe

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息