1 Star 0 Fork 0

珎珎/linux-learning

加入 Gitee
與超過 1200 萬 開發者一起發現、參與優秀開源項目,私有倉庫也完全免費 :)
免費加入
文件
克隆/下載
tcpsocket.hpp 3.30 KB
一鍵複製 編輯 原始數據 按行查看 歷史
root 提交於 2年前 . select-tcp
#ifndef __MY_SOCKET__H
#define __MY_SOCKET__H
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>
#define MAX_LISTEN 5 //最大监听套接字个数
class TcpSocket{
private:
int _sockfd;
public:
TcpSocket():_sockfd(-1){}
TcpSocket(int fd):_sockfd(fd) {}
~TcpSocket()
{
// Close();
}
void SetFd(int fd) {_sockfd=fd;}
int GetFd() { return _sockfd;}
bool Socket(){
//创建套接字
_sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(_sockfd<0){
perror("socket error!\n");
return false;
}
return true;
}
bool Bind(const std::string& ip,int port){
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=inet_addr(ip.c_str());
socklen_t len=sizeof(addr);
int ret=bind(_sockfd,(struct sockaddr*)&addr,len);
if(ret<0){
perror("bind error!\n");
return false;
}
return true;
}
bool Connect(const std::string& ip,int port){
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=inet_addr(ip.c_str());
socklen_t len=sizeof(addr);
int ret=connect(_sockfd,(struct sockaddr*)&addr,len);
if(ret<0){
perror("connect error!\n");
return false;
}
return true;
}
bool Listen(int backlog=MAX_LISTEN){
int ret= listen(_sockfd,backlog);
if(ret<0){
perror("listen error!\n");
return false;
}
return true;
}
bool Accept(TcpSocket* sock){
struct sockaddr_in addr;
socklen_t len=sizeof(addr);
int newfd=accept(_sockfd,(struct sockaddr*)&addr,&len);
//int newfd=accept(_sockfd,NULL,NULL);
if(newfd<0){
perror("accept error!\n");
return false;
}
sock->_sockfd=newfd;
return true;
}
bool Recv(std::string* body){
char tmp[1024]={0};
int ret=recv(_sockfd,tmp,1024,0);
if(ret<0){
//EAGAIN 当前接收数据时,socket 接收缓冲区没有数据;若阻塞操作则一直等待,若非阻塞则立即报错返回
//EINTR 当前接收数据时,被信号打断了
//if(errno==EAGAIN || errno == EINTR){
// return true;
// }
perror("recv error!\n");
return true;
}else if(ret==0){
printf("peer shutdown!\n");
return false;
}
body->assign(tmp,ret);
return true;
}
bool Send(const std::string& body){
// int slen=0; //若一次性无法发送数据 --- 采用循环发送
//while(slen<body.size()){
// int ret=send(_sockfd,&body[slen],body.size()-slen,0);
// if(ret<0){
// if(errno==EAGAIN || errno == EINTR){
// continue;
// }
// perror("send error!\n");
// return false;
// }
// slen+=ret;
// }
int ret=send(_sockfd,body.c_str(),body.size(),0);
if(ret<0){
//if(errno==EAGAIN || errno ==EINTR){
// return true;
// }
perror("send error");
return true;
}
return true;
}
bool Close(){
if(_sockfd > 0){
close(_sockfd);
_sockfd=-1;
}
return true;
}
};
#endif
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/Coderxingchild/linux-learning.git
git@gitee.com:Coderxingchild/linux-learning.git
Coderxingchild
linux-learning
linux-learning
master

搜索幫助