linux下socket模板函数接受与发送

来源:互联网 发布:windows查看进程命令 编辑:程序博客网 时间:2024/05/24 02:31

看标题好像有点不明白啊,兄弟?

那我稍微的解释一下

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

我写过很多个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;}elseprintf("%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;}


原创粉丝点击