套接字操作起来流程比较复杂,刚开始接触不久的话如果要实现多线程等操作会很混乱,参考了一位博主的代码进行了套接字的封装:https://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html
mySocket.h
#include <iostream>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string>
#include <netinet/in.h>
using namespace std;
const int MAXCONNECTIONS=10;
const int MAXRECEIPTIONS = 100;
class mySocket{
public:
int sockfd;
struct sockaddr_in addr;
int ip_type;
mySocket(){
sockfd=::socket(AF_INET,SOCK_STREAM,0);
ip_type=AF_INET;
if(sockfd<0){cout<<"Failed to create sock."<<endl;}
}
mySocket(int _domain,int _type,int _protocol){
sockfd=::socket(_domain,_type,_protocol);
ip_type=_domain;
if(sockfd<0){cout<<"Failed to create sock."<<endl;}
}
~mySocket(){if(isvalid())close(sockfd);cout<<"Socket has been delete"<<endl;}
//methods for server initialization
bool bind_addr(const string _ip,const int _port){
//memset(&addr, 0, sizeof(addr));
addr.sin_family=ip_type;
addr.sin_addr.s_addr=inet_addr(_ip.c_str());
addr.sin_port=htons(_port);
const int on=1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));//设置使bind在重启后不会出现(linux网络编程/tcp_server中server bind失败原因的)
int bRes=bind(sockfd,(sockaddr*)&addr,sizeof(addr));
if(bRes<0)return false;
return true;
}
bool listen_fd()const{
int lres=listen(sockfd,MAXCONNECTIONS);
return lres<0?false:true;
}
bool accept_sock(mySocket& clientsock)const{
int clientaddrLength=sizeof(clientsock.addr);
clientsock.sockfd=::accept(sockfd,(sockaddr*)&clientsock.addr,(socklen_t*)&clientaddrLength);
return clientsock.sockfd<0?false:true;
}
//method for client initialization
bool connect_sock(const string _ip,const int _port){
if(!isvalid())return false;
addr.sin_family=ip_type;
addr.sin_addr.s_addr=inet_addr(_ip.c_str());
addr.sin_port=htons(_port);
int cRes=connect(sockfd,(sockaddr*)&addr,sizeof(addr));
if(cRes<0)return false;
return true;
}
//data transmission
bool send_msg(mySocket& tar,const string msg)const{
int res=send(tar.sockfd,(char*)msg.c_str(),msg.length(),0);
return res<0?false:true;
}
int receive(mySocket& source,string& msg)const{
msg.clear();
char buf[MAXRECEIPTIONS+1];
int numberRead=recv(source.sockfd,buf,MAXRECEIPTIONS,0);
if(numberRead<0){cout<<"Error in socket receiption."<<endl;return 0;}
else if(numberRead==0)return 0;
else{msg+=buf;return numberRead;}
}
bool isvalid()const{return sockfd!=-1;}
};
利用mySocket进行了客户端与服务器的通信
server.cpp
#include "mySocket.h"
int main(){
cout<<"Server:\n";
mySocket a,b;
bool bRes=a.bind_addr("127.0.0.1",1233);
a.listen_fd();
bool aRes=a.accept_sock(b);
if(aRes)cout<<"CONNECTED"<<endl;
while(aRes){
string msg="";
int rRes=a.receive(b,msg);
if(rRes>0){
cout<<"Message from client:"<<msg<<endl;
string tres="";
for(auto i:msg){tres+=(i+1);}
b.send_msg(b,tres);
}
else{break;}
}
cout<<endl<<"Disconnected."<<endl;
return 0;
}
client.cpp
#include "../mySocket/mySocket.h"
int main()
{
mySocket a;
cout<<"client:\n";
bool cRes=a.connect_sock("127.0.0.1",1233);
if(cRes)cout<<"Connected"<<endl;
while(cRes){
string msg="";
cout<<"Please enter:";
getline(cin,msg);
bool sRes=a.send_msg(a,msg);
if(sRes){
int rRes=a.receive(a,msg);
if(rRes>0)
cout<<"Message from server:"<<msg<<endl;
else{break;}
}
else{break;}
}
cout<<endl<<"Disconnected."<<endl;
return 0;
}
左边为客户端,右图为服务器