简单封装 并不实际应用
框架图
Mysocket 主要是定义TCP和UDP的一些相同的操作,需要的他们各自去实现。
Mysocket.h
#ifndef MYSOCKET_H
#define MYSOCKET_H
class MySocket
{
public:
MySocket();
~MySocket();
// 创建一个套接字
virtual int Create(){};
// IO操作
virtual int Send(){};
virtual int Recvice(){};
// 关闭
virtual void Close(){};
};
MySocket::MySocket()
{
}
MySocket::~MySocket()
{
}
#endif // !MYSOCKET
TcpSocket 首先实现一些客户端和服务端公用的接口,然后利用虚函数定义一些他们各自需要实现的接口。
TcpSocket.h
#ifndef TCPSOCKET_H
#define TCPSOCKET_H
#include <sys/types.h>
#include <sys/socket.h>
#include "MySocket.h"
#include <stdlib.h>
class TcpSocket
: public MySocket
{
public:
TcpSocket();
~TcpSocket();
// 重写覆盖
int Create() override;
int Send() override;
int Recvice() override;
void Close() override;
// server端操作
virtual int Bind(char *IP,int PORT){};
virtual int Listen(){};
virtual int Accept(){};
// client操作
virtual int Connect(char *IP,int PORT){};
int fd; // socket描述符
int fd1; // aceept接受描述符
char rbuf[1024];
char sbuf[1024];
};
#endif // !TCPSOCKET_H
TcpSocket.cpp
#include "TcpSocket.h"
#include <iostream>
#include <unistd.h>
using namespace std;
TcpSocket::TcpSocket()
{
}
TcpSocket::~TcpSocket()
{
Close();
}
int TcpSocket::Create()
{
int f = socket(AF_INET, SOCK_STREAM, 0);
if(f != -1){
cout << "socke创建成功:" << f << endl;
}
return f;
}
int TcpSocket::Send()
{
write(fd, sbuf, sizeof(sbuf) - 1);
return 0;
}
int TcpSocket::Recvice()
{
int s = read(fd1, rbuf, sizeof(rbuf) - 1);
if(s > 0){
cout << "client:" << rbuf << endl;
}
// if(s == -1){
// // cout << "连接中断" << endl;
// break;
// }
return s;
}
void TcpSocket::Close()
{
shutdown(fd, 2);
shutdown(fd1, 2);
}
TcpServerSocket实现服务端特有的功能
TcpServerSocket.h
#ifndef TCPSERVERSOCKET_H
#define TCPSERVERSOCKET_H
#include <sys/types.h>
#include <sys/socket.h>
#include "TcpSocket.h"
class TcpServerSocket : public TcpSocket
{
public:
TcpServerSocket();
~TcpServerSocket();
int Bind(char *IP,int PORT) override;
int Listen() override;
int Accept() override;
};
#endif // !TCPSERVERSOCKET_H
TcpServerSocket.cpp
#include "TcpServerSocket.h"
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
TcpServerSocket::TcpServerSocket()
{
}
TcpServerSocket::~TcpServerSocket()
{
}
int TcpServerSocket::Bind(char *IP,int PORT)
{
cout << "+++++++++" << endl;
struct sockaddr_in sin;
cout << "addr1:" << IP << endl;
cout << "PORT1:"<< PORT << endl;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
// cout << "addr:" << sin.sin_addr.s_addr << endl;
// cout << "PORT:"<< sin.sin_port << endl;
if(bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0){
cout << "绑定失败" << endl;
return -1;
}
else
{
cout << "绑定成功" << endl;
}
return 0;
}
int TcpServerSocket::Listen()
{
if(listen(fd, 50) < 0){
cout << "监听失败" << endl;
return -1;
}
else{
cout << "listening。。。。。。" <<endl;
}
return 0;
}
int TcpServerSocket::Accept()
{
struct sockaddr_in sin;
socklen_t len = sizeof(struct sockaddr);
fd1 = accept(fd, (sockaddr *)&sin, &len);
if(fd1 != -1){
cout << "accepting...."<<endl;
return fd1;
}
else{
cout << "accept失败" << endl;
}
return -1;
}
TcpClientSocket.h
#ifndef TCPCLIENTSOCKET_H
#define TCPCLIENTSOCKET_H
#include "TcpSocket.h"
#include <sys/types.h>
#include <sys/socket.h>
class TcpClientSocket :
public TcpSocket
{
public:
TcpClientSocket();
~TcpClientSocket();
int Connect(char *IP,int PORT) override;
};
#endif
TcpClientSocket.cpp
#include "TcpClientSocket.h"
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
TcpClientSocket::TcpClientSocket()
{
}
TcpClientSocket::~TcpClientSocket()
{
}
int TcpClientSocket::Connect(char *IP,int PORT)
{
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
int e = connect(fd, (sockaddr *)&sin, sizeof(sin));
if(e!= -1){
std::cout << "连接成功" << std::endl;
}
else
{
std::cout << "连接失败" << std::endl;
return -1;
}
return 0;
}
测试代码
server.cpp
#include <iostream>
#include "TcpSocket.h"
#include "TcpServerSocket.h"
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
int main(int argc, const char** argv) {
TcpSocket *socket = new TcpServerSocket();
socket->fd = socket->Create();
// cout << "+++++++++" << endl;
socket->Bind("127.0.0.1",1477);
socket->Listen();
socket->Accept();
while (1)
{
socket -> Recvice();
}
return 0;
}
client.cpp
#include <iostream>
#include "TcpSocket.h"
#include "TcpClientSocket.h"
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
int main(int argc, const char** argv) {
TcpSocket *socket = new TcpClientSocket();
socket->fd = socket->Create();
int e = socket->Connect("127.0.0.1",1477);
if(e != -1)
{
while (1)
{
cin >> socket -> sbuf;
cout << "sbuf:" << socket -> sbuf <<endl;
socket -> Send();
}
}
cout << "111";
return 0;
}
UDP的代码直接放一块了
// UdpSocket.h
#ifndef UDPSOCKET_H
#define UDPSOCKET_H
#include "MySocket.h"
class UdpSocket
: public MySocket
{
public:
UdpSocket();
~UdpSocket();
int Create() override;
// IO操作
virtual int Sendto(char *IP, int PORT){};
virtual int Recvfrom(){};
virtual int Bind(char *IP,int PORT){};
// 关闭
void Close() override;
int fd; // socket描述符
// int fd1; // aceept接受描述符
char sbuf[1024];
};
#endif // !UDPSOCKET_H
//UdpSocket.cpp
#include "UdpSocket.h"
#include <sys/socket.h>
#include <iostream>
#include <unistd.h>
using namespace std;
UdpSocket::UdpSocket()
{
}
UdpSocket::~UdpSocket()
{
Close();
}
int UdpSocket::Create()
{
int f = socket(AF_INET, SOCK_DGRAM, 0);
if(f != -1){
cout << "socke创建成功:" << f << endl;
}
return f;
}
void UdpSocket::Close()
{
shutdown(fd, 2);
// shutdown(fd1, 2);
}
// UdpServerSocket.h
#include "UdpSocket.h"
class UdpServerSocket
: public UdpSocket
{
public:
UdpServerSocket();
~UdpServerSocket();
int Bind(char *IP,int PORT) override;
int Recvfrom() override;
char rbuf[1024];
};
//UdpServerSocket.cpp
#include "UdpServerSocket.h"
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
UdpServerSocket::UdpServerSocket()
{
}
UdpServerSocket::~UdpServerSocket()
{
}
int UdpServerSocket::Bind(char *IP,int PORT)
{
cout << "+++++++++" << endl;
struct sockaddr_in sin;
cout << "addr1:" << IP << endl;
cout << "PORT1:"<< PORT << endl;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
// cout << "addr:" << sin.sin_addr.s_addr << endl;
// cout << "PORT:"<< sin.sin_port << endl;
if(bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0){
cout << "绑定失败" << endl;
return -1;
}
else
{
cout << "绑定成功" << endl;
}
return 0;
}
int UdpServerSocket::Recvfrom()
{
struct sockaddr_in clientaddr;
socklen_t len = sizeof(sockaddr_in);
int s = recvfrom(fd, rbuf, sizeof(rbuf) - 1, 0, (struct sockaddr *) &clientaddr, &len);
if(s > 0){
cout << "client:" << rbuf << endl;
}
// if(s == -1){
// // cout << "连接中断" << endl;
// break;
// }
return s;
}
// UdpClientSocket.h
#include "UdpSocket.h"
class UdpClientSocket
: public UdpSocket
{
public:
UdpClientSocket();
~UdpClientSocket();
int Sendto(char *IP, int PORT) override;
};
// UdpClientSocket.cpp
#include "UdpClientSocket.h"
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
UdpClientSocket::UdpClientSocket()
{
}
UdpClientSocket::~UdpClientSocket()
{
}
int UdpClientSocket::Sendto(char *IP, int PORT)
{
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(IP);
serveraddr.sin_port = htons(PORT);
socklen_t len = sizeof(sockaddr_in);
sendto(fd, sbuf, sizeof(sbuf) - 1, 0, (struct sockaddr *) &serveraddr, len);
return 0;
}
// server.cpp
#include <iostream>
#include "UdpSocket.h"
#include "UdpServerSocket.h"
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
int main(int argc, const char** argv) {
UdpSocket *socket = new UdpServerSocket();
socket->fd = socket->Create();
// cout << "+++++++++" << endl;
socket->Bind("127.0.0.1",1221);
while (1)
{
socket -> Recvfrom();
}
cout << "asd";
return 0;
}
//client.cpp
#include <iostream>
#include "UdpSocket.h"
#include "UdpClientSocket.h"
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
int main(int argc, const char** argv) {
UdpSocket *socket = new UdpClientSocket();
socket->fd = socket->Create();
while (1)
{
cin >> socket -> sbuf;
socket->Sendto("127.0.0.1",1221);
}
cout << "111";
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)