服务器端:
sever.cpp
#include <stdio.h>
#include <errno.h>
#include <iostream>
#include <json/json.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/stat.h>
using namespace std;
int main(int argc,char *argv[])
{
if(argc <3)
{
cerr<<"can shu bu gou;errno:"<<errno<<endl;
return 0;
}
char* ip = argv[1];
int port = atoi(argv[2]);
int sockfd = socket(AF_INET,SOCK_STREAM,0);
assert(sockfd != -1);
struct sockaddr_in ser,cli;
memset(&ser,0,sizeof(ser));
ser.sin_family = AF_INET;
ser.sin_port = htons(port);
ser.sin_addr.s_addr = inet_addr(ip);
int res = bind(sockfd,(struct sockaddr*)&ser,sizeof(ser));
assert(res != -1);
listen(sockfd,5);
while(1)
{
socklen_t len = sizeof(cli);
int c = accept(sockfd,(struct sockaddr*)&cli,&len);
assert(c != -1);
while(1)
{
char buff[128] = {0};
if(0>=recv(c,buff,127,0))
{
cerr<<"recv fail;errno:"<<errno<<endl;
break;
}
Json::Value val;
Json::Reader read;
if(-1 == read.parse(buff,val))
{
cerr<<"json read fail;errno"<<errno<<endl;
return 0;
}
cout<<val["fd"].asString()<<":"<<val["message"].asString()<<endl;
Json::Value root;
root["fd"] = val["fd"];
root["message"] = "OK";
if(-1 == send(c,root.toStyledString().c_str(),strlen(root.toStyledString().c_str()),0))
{
cerr<<"send fail;errno:"<<errno<<endl;
return 0;
}
}
}
}
tcpsever.h
#ifndef TCPSEVER+H
#define TCPSEVER_H
#include<vector>
#include<event.h>
class fd
{
public:
fd(int err[2])
{
arr[0] = err[0];
arr[1] = err[1];
}
~fd()
{
close(arr[0]);
close(arr[1]);
}
int arr[2];
};
class TcpSever
{
public:
TcpSever(char *ip,unsigned short port,int pth_num);
~TcpSever();
void run();
void ser_connect();
void socket_pair_creat();
void pth_create();
private:
int _listen_fd;//监听套接字
int _pth_num;//线程个数
vector<int> _ser_vec;//服务器
vector<int[2]> _sockpair_vec;//socket_pair
struct base* _base;//libevent
map<int,struct event*> _event_vec;//事件保存
map<int,int> _pth_event_num;//线程事件数量
friend void listen_cb(int fd,short event,void *arg);
friend void sock_0_cb(int fd,short event,void *arg);
};
#endif
tcpsever.cpp
#include <iostream>
#include "tvpsever.h"
#include "mpthread.h"
#include <event.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <map>
#include <stdlib.h>