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;}
阅读全文
0 0
- linux下socket模板函数接受与发送
- linux下UDP客户端通用发送与接受
- socket通信阻塞模式下,设置发送和接受函数超时
- 测试Linux下socket每次发送数据和接受数据的最大值
- Socket发送和接受
- Linux下发送与接收组播数据(socket编程)
- Linux下发送与接收组播数据(socket编程)
- Linux下发送与接收组播数据(socket编程)
- socket发送和接受数据
- socket通信里用得比较多的是发送和接受函数
- linux下sctp socket发送延迟问题
- socket中的发送与接收函数
- socket中的发送与接收函数
- SOCKET UDP 发送和接受示例代码
- C#使用socket发送和接受数据
- 关于通过Socket发送接受方式
- java android Socket通信 发送以及接受
- linux socket 图片接受
- iOS开发资料
- mybatis 参考文档地址
- STM32F407时钟配置
- HDU初学者训练指南(转载),感谢前人们的贡献
- HTML5+CSS3(播放视频,矩形,半圆,选择器)
- linux下socket模板函数接受与发送
- Andorid N 最近任务管理器流程详解(五)
- php 之 system exec
- C的八大排序法
- 鼠标悬浮出现列表后点击
- 分布式session
- 【bzoj2150】部落战争(最小路径覆盖)
- cropper.js 实现HTML5 裁剪图片并上传(裁剪上传头像。)
- JZOJ 1407. 教主的游乐场