Linux 管道通信 客户端与服务器通信
实现多个客户端之间的通信(进程之间的通信),服务器作为中转站,并提示哪个客户端上线
运行命令
mkfifo fifo
gcc server.c -o server
gcc client.c -o client
./server fifo
在开三个终端分别输入./client fifo 表示三个客户端
服务器代码
/*************************************************************************> File Name: server.c> Author: yang> Mail:826123027@qq.com > Created Time: 2014年08月23日 星期六 18:59:46************************************************************************/#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
typedef struct tag{//储存进程信息int s_id;//客户端的进程号int s_fd;//向客户端发送信息的标识符int s_flag;//标记是否在server的队列里面
}USR,*pUSR;
int main(int argc,char *argv[]){int fd_server;USR ulist[1024];memset(ulist,0,sizeof(ulist));int nret;char buf[1024];fd_server=open(argv[1],O_RDONLY);//之前就建好的管道,负责客户端向server发送 三种信息分别为1)在线 2)客户发送的消息 3)下线if(fd_server==-1){perror("error");exit(1);}fd_set bak_set,ready_set;//bak_set先备份一下FD_ZERO(&bak_set);FD_SET(fd_server,&bak_set);struct timeval tm;//间隔时间while(1){tm.tv_sec=0;tm.tv_usec=1000;ready_set=bak_set;nret=select(fd_server+1,&ready_set,NULL,NULL,&tm);//检测进程中有几个向server发送信息if(nret==0)continue;if(FD_ISSET(fd_server,&ready_set)){//检测标识符fd_server是否发送信息memset(buf,0,1024);if(read(fd_server,buf,1024)==0){continue; }else{if(strncmp(buf,"on",2)==0){//检测穿来的信息是不是上线信息int pid;char pipename[32]="";sscanf(buf+3,"%d",&pid);printf("%d on \n",pid);sprintf(pipename,"%d.fifo",pid);int index;for(index=0;index<1024;index++)if(ulist[index].s_flag==0)break;if(index==1024)printf("full!\n");else{ulist[index].s_flag=1;ulist[index].s_id=pid;ulist[index].s_fd=open(pipename,O_WRONLY);}}else if(strncmp(buf,"off",3)==0){//是不是下线信息int pid;sscanf(buf+3,"%d",&pid);char pipename[32]="";sprintf(pipename,"%d.fifo",pid);printf("%d off\n",pid);int index;for(index=0;index<1024;index++){if(ulist[index].s_id==pid){ulist[index].s_flag=0;ulist[index].s_id=0;close(ulist[index].s_fd);break;}}}else {//其他消息int index;for(index=0;index<1024;index++){if(ulist[index].s_flag==1)write(ulist[index].s_fd,buf,strlen(buf));}}}}}
}
客户端代码
/*************************************************************************> File Name: client.c> Author: yang> Mail:826123027@qq.com > Created Time: 2014年08月23日 星期六 19:54:40************************************************************************/#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
int main(int argc,char *argv[]){char pipename[32]="";int fd_send,fd_recv;sprintf(pipename,"%d.fifo",getpid());if(-1==mkfifo(pipename,0666)){//根据这个名字建管道perror("mkfifo");exit(1);}char msg[1024]="";sprintf(msg,"on %d\n",getpid());fd_send=open(argv[1],O_WRONLY);if(fd_send==-1){perror("open");exit(1);}write(fd_send,msg,strlen(msg));//发送上线信息fd_recv=open(pipename,O_RDONLY);//从这个新管道读if(fd_recv==-1){perror("open client");exit(1);}if(fork()==0){//另开辟进程用来读close(fd_send);while(memset(msg,0,1024),read(fd_recv,msg,1024)>0){printf("msg>>:");write(1,msg,strlen(msg));}close(fd_recv);exit(1);}
// close()用来写信息while(memset(msg,0,1024),fgets(msg,1024,stdin)!=NULL){write(fd_send,msg,strlen(msg));}memset(msg,0,1024);//发送下线信息sprintf(msg,"off %d\n",getpid());write(fd_send,msg,strlen(msg));close(fd_send);close(fd_recv);wait(NULL);
}
Linux 管道通信 客户端与服务器通信相关推荐
- qt与JAVA服务器通信_Qt实现的SSL通信客户端和服务器
[实例简介] Qt实现的SSL通信客户端和服务器 使用QSslSocket实现加密通信 [实例截图] [核心代码] f3a25e44-604e-4435-9e05-3f6efe57c6b0 └── s ...
- Websocket(二)-客户端与服务器通信
Websocket(二)-客户端与服务器通信 服务端 客户端测试 const WebSocket = require('ws'); const Server = WebSocket.Server; c ...
- 输入URL,客户端到服务器通信的过程
输入URL,客户端到服务器通信全过程 按五层网络协议进行理解: 在主机上: 1.第五层--应用层:DNS解析 2.第四层--传输层:TCP三次握手.四次挥手 3.第三层--网络层:IP层 4.第2.5 ...
- Exchange邮件系统客户端与服务器通信常用网络端口
Exchange邮件系统:客户端与服务器通信常用网络端口 序号 用途 端口 1 未加密的web连接: •互联网日历发布 •Outlook on the web(重定向到443/TCP) •自动发现(4 ...
- C++基于TCP/IP简单的客户端、服务器通信程序实例
本篇文章实现了一个基于TCP 的一个非常简单的客户/服务器通信程序实例.该程序中通讯协议使用的是面向连接的TCP协议SOCK_STREAM, 服务器的ip地址为本地地址即: 127.0.0.1,端口号 ...
- java socket5源码_Java利用TCP协议实现客户端与服务器通信【附通信源码】
进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. TCP协议概念 先来了解一下TCP协议 ...
- Python网络编程【客户端与服务器通信】
一.将数据写在发送语句中[传统方式] server端代码: import socket #服务器端将socket套接字赋给sock套接字 sock=socket.socket(socket.AF_IN ...
- 全网疯传!Java利用TCP协议实现客户端与服务器通信【附通信源码
目录 TCP协议概念 ServerSocket类 服务器端程序 客户端程序 Hello!大家好哇!我是灰小猿! 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套 ...
- Windows网络编程入门:简单的客户端和服务器通信程序调试
昨日入手Windows网络编程经络这本书,第一章给了Echo客户端和服务器的简单通信实例程序.从小白到入门目测都是比较苦逼,居然想不到怎么来测试结果.什么同时运行啊.分别编译运行啊乱七八糟的想法就开始 ...
- qt之TCP/IP通信客户端与服务器自动连接互相传输数据
一.前言 在开发上位机软件,用的最多的通信就是网络通信,串口通信和USB通信,串口通信相对是最容易的,USB通信在前面的文章中也专门写了一个博客介绍USB HID通信方式,见链接:https://bl ...
最新文章
- dubbo consumer 端口_初识Dubbo
- 医改大背景下的第三方检验行业发展趋势
- 去掉字符串连续出现K个0的子串
- 【转】ubuntu 下 VNCview 远程桌面无法传输文件问题
- ROS : 修改ROS源代码(overlaying package)
- 索尼Xperia 2带壳渲染图曝光:外形依然很索尼
- anaconda python no module named ‘past‘的解决方法
- 测试开发面试题汇总(自用)
- http工作原理和机制
- 【Adobe Premiere Pro 2020】ps图稿导出到pr创建运动图形、pr音频录制与音频效果使用说明、pr导出为mp4格式及参数设置说明【包含其他几种常见格式】、pr去水印的4种方法说明
- 面试官问“你还有什么需要了解的吗”——应该这样回答
- 每周写周报每天写总结
- 致远互联发布A6+在打什么牌?
- 可视化接口管理平台 YApi,让你轻松搞定 API 的管理问题
- 19.1 快速幂的定义和模板
- mysql存储过程while循环语句
- Android 更换开机logo和开机动画
- 【TypeScript 专题】之 Ts 中的类(class)
- Oracle Database SQL Language Reference 笔记(3)—— 伪列(续)
- ❥关于C++之函数指针函数对象