说明:本实例利用了libuv库中的pipe管道实现进程通信,类似与本地套接字。客户端连接服务器端建立连接后相互发送数据。
客户端使用了readline库实现控制台输入命令,客户端将命令字符串传给服务端。
服务端:
文件LocalServer.h
#pragma once
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
using namespace std;
#define PIPENAME "pipe.sock"
extern "C"
{
#include "uv.h"
#include "uv-errno.h"
}
class LocalServer;
typedef struct{
uv_pipe_t server_client;
LocalServer *ts;
}UvPipe;
class LocalServer
{
public:
LocalServer();
~LocalServer();
int initLocalServer(uv_loop_t* loop);
static void remove_sock(int sig);
static void onPipeConnectionCb(uv_stream_t* server,int status);
void onPipeConnection(uv_stream_t* server,int status);
static void onPipeReadCb(uv_stream_t* client,ssize_t nread,const uv_buf_t* buf);
void onPipeRead(uv_stream_t* client,ssize_t nread,const uv_buf_t* buf);
static void allocPipeBufferCb(uv_handle_t* handle,size_t suggested_size,uv_buf_t* buf);
void allocPipeBuffer(uv_handle_t* handle,size_t suggested_size,uv_buf_t* buf);
private:
uv_loop_t* mLoop;
UvPipe pipeServer;
};
文件:LocalServer.cpp
#include "LocalServer.h"
LocalServer::LocalServer()
{
}
LocalServer::~LocalServer()
{
}
int LocalServer::initLocalServer(uv_loop_t* loop)
{
if(loop==NULL)
{
cout<<"mllop is null "<<endl;
}
mLoop=loop;
//若sock文件PIPENAME存在则删除
uv_fs_t req;
uv_fs_unlink(mLoop,&req,PIPENAME,NULL);
uv_pipe_init(mLoop,(uv_pipe_t*)&pipeServer,0);
//程序终止时删除sock文件PIPENAME
signal(SIGINT,remove_sock);
pipeServer.ts=this;
in