看标题好像有点不明白啊,兄弟?
那我稍微的解释一下
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我写过很多个socket程序的demo,
每一个程序要发送什么数据,都要改双方的接收和发送函数,这样显得太笨拙了,而且根本无法移植好吗....
后面我想到了模板函数::::::::::::::::::::::::::::::::::::::::
大家都知道模板可以支持任何类型的数据作为参数
那么我们只要把接收发送函数做成模板不就行了,,,,,
只需要指定发送包的类型就可以正常使用了,简直不能太方便好吗.
下面程序是我封装好的一个客服端和服务器基类,直接继承或者修改就可以使用了,数据包(结构体)得自己设计,基类不用做任何修改完美兼容
代码比较多:提供一个下载地址:
http://download.csdn.net/detail/hes_c/9870592
服务器.h:
#ifndef _my_server
#define _my_server
#include "string.h"
#include "iostream"
#include "stdio.h"
#include "fcntl.h"
#include "stdlib.h"
#include "unistd.h"
#include "sys/socket.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "signal.h"
using namespace std;
/
class my_server
{
private:
//ip地址
string ip;
//端口
int port;
//客服端
int cfd;
//服务器
int sfd;
//监听的数两
int listen_num;
struct sockaddr_in saddr;
struct sockaddr_in caddr;
socklen_t caddrlen;
public:
my_server();
~my_server();
void set_ip(string _ip){ip=_ip;}
void set_port(int _port){port=_port;}
void set_lis_num(int _num){listen_num=_num;}
int get_cfd(){return cfd;}
int create_net();
int accept_cfd();
int close_net();
//利用模板函数接受任意包
template <typename T>
T recv()
{
T buff;
if(cfd!=-1)
{
int v=read(cfd,&buff,sizeof buff);
if(v>0)
return buff;
}
else printf("client exit\n");
return buff;
}
//利用模板函数发送任意包
template <typename T>
void send(T buff)
{
if(cfd!=-1)
write(cfd,&buff,sizeof buff);
}
};
#endif
服务器.cpp:
#include "my_server.h"
my_server::my_server()
{
ip="127.0.0.1";
port=8888;
listen_num=10;
}
my_server::~my_server()
{
close(sfd);
close(cfd);
}
int my_server::create_net()
{
int v=0;
//创建socket套接字
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1)
{
printf("create sfd:error\n");
return 1;
}
saddr.sin_family=AF_INET;
//saddr.sin_addr.s_addr=inet_addr(ip.data());
saddr.sin_addr.s_addr=htonl(INADDR_ANY);;
saddr.sin_port=htons(port);
v=bind(sfd,(struct sockaddr*)&saddr,sizeof saddr);
if(v==-1)
{
printf("bing error\n");
return 2;
}
v=listen(sfd,listen_num);
if(v==-1)
{
printf("listen error\n");
return 3;
}
printf("server start\n");
return 0;
}
int my_server::accept_cfd()
{
cfd=accept(sfd,(struct sockaddr *)&caddr,&caddrlen);
if(cfd==-1)
{
printf("client connect error\n");
return 4;
}
else
printf("%d:connect ok\n",cfd);
return cfd;
}
int my_server::close_net()
{
return 0;
}
客服端.h
#ifndef _my_client
#define _my_client
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "string"
#include "string.h"
#include "sys/socket.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "arpa/inet.h"
using namespace std;
/
class my_client
{
private:
string ip;
int port;
int cfd;
struct sockaddr_in caddr;
public:
my_client();
~my_client();
void set_ip(string _ip){ip=_ip;}
void set_port(int _port){port=_port;}
int create_net();
template <typename T>
T recv()
{
T buff;
int v=read(cfd,&buff,sizeof buff);
//buff[v]=0;
//printf("%s\n",buff);
if(v>0)
return buff;
}
template <typename T>
void send(T buff)
{
write(cfd,&buff,sizeof buff);
}
};
#endif
客服端.cpp
#include "my_client.h"
my_client::my_client()
{
}
my_client::~my_client()
{
}
int my_client::create_net()
{
int v=0;
//创建客服端套接字
cfd=socket(AF_INET,SOCK_STREAM,0);
if(cfd==-1)
{
printf("create client error\n");
return 1;
}
//初始化地址族
caddr.sin_family=AF_INET;
caddr.sin_addr.s_addr=inet_addr(ip.data());
caddr.sin_port=htons(port);
//连接服务器
v=connect(cfd,(struct sockaddr*)&caddr,sizeof caddr);
if(v==-1)
{
printf("connect server error\n");
return 2;
}else printf("connect server ok\n");
return 0;
}
服务端测试.cpp
#include "my_server.h"
struct data
{
char buf[20];
int n;
char ch;
}buff;
int n;
int main()
{
my_server S;
S.set_port(12345);
S.create_net();
S.accept_cfd();
buff=S.recv<struct data>();
printf("%s\n",buff.buf);
printf("%d\n",buff.n);
printf("%c\n",buff.ch);
buff.n=222;
S.send<struct data>(buff);
S.close_net();
return 1;
}
客服端调试.cpp
#include "my_client.h"
struct data
{
char buf[20];
int n;
char ch;
}buff,buff1;
int main()
{
my_client C;
C.set_ip("127.0.0.1");
C.set_port(12345);
C.create_net();
strcpy(buff.buf,"hello hes");
buff.n=19;
buff.ch='A';
C.send<struct data>(buff);
buff1=C.recv<struct data>();
printf("%s\n",buff1.buf);
printf("%d\n",buff1.n);
return 1;
}