socket通讯的函数和类
socket通讯的客户端类
class CTcpClient
{
public:
int m_connfd;
char m_ip[21];
int m_port;
bool m_btimeout;
int m_buflen;
CTcpClient();
bool ConnectToServer(const char *ip,const int port);
bool Read(char *buffer,const int itimeout=0);
bool Write(const char *buffer,const int ibuflen=0);
void Close();
~CTcpClient();
};
--实现
CTcpClient::CTcpClient()
{
m_connfd=-1;
memset(m_ip,0,sizeof(m_ip));
m_port=0;
m_btimeout=false;
}
bool CTcpClient::ConnectToServer(const char *ip,const int port)
{
if (m_connfd!=-1) { close(m_connfd); m_connfd=-1; }
signal(SIGPIPE,SIG_IGN);
STRCPY(m_ip,sizeof(m_ip),ip);
m_port=port;
struct hostent* h;
struct sockaddr_in servaddr;
if ( (m_connfd = socket(AF_INET,SOCK_STREAM,0) ) < 0) return false;
if ( !(h = gethostbyname(m_ip)) )
{
close(m_connfd); m_connfd=-1; return false;
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(m_port);
memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);
if (connect(m_connfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0)
{
close(m_connfd); m_connfd=-1; return false;
}
return true;
}
bool CTcpClient::Read(char *buffer,const int itimeout)
{
if (m_connfd==-1) return false;
if (itimeout>0)
{
struct pollfd fds;
fds.fd=m_connfd;
fds.events=POLLIN;
int iret;
m_btimeout=false;
if ( (iret=poll(&fds,1,itimeout*1000)) <= 0 )
{
if (iret==0) m_btimeout = true;
return false;
}
}
m_buflen = 0;
return (TcpRead(m_connfd,buffer,&m_buflen));
}
bool CTcpClient::Write(const char *buffer,const int ibuflen)
{
if (m_connfd==-1) return false;
int ilen=ibuflen;
if (ibuflen==0) ilen=strlen(buffer);
return(TcpWrite(m_connfd,buffer,ilen));
}
void CTcpClient::Close()
{
if (m_connfd > 0) close(m_connfd);
m_connfd=-1;
memset(m_ip,0,sizeof(m_ip));
m_port=0;
m_btimeout=false;
}
CTcpClient::~CTcpClient()
{
Close();
}
socket通讯的服务端类
class CTcpServer
{
private:
int m_socklen;
struct sockaddr_in m_clientaddr;
struct sockaddr_in m_servaddr;
public:
int m_listenfd;
int m_connfd;
bool m_btimeout;
int m_buflen;
CTcpServer();
bool InitServer(const unsigned int port,const int backlog=5);
bool Accept();
char *GetIP();
bool Read(char *buffer,const int itimeout=0);
bool Write(const char *buffer,const int ibuflen=0);
void CloseListen();
void CloseClient();
~CTcpServer();
};
--实现
CTcpServer::CTcpServer()
{
m_listenfd=-1;
m_connfd=-1;
m_socklen=0;
m_btimeout=false;
}
bool CTcpServer::InitServer(const unsigned int port,const int backlog)
{
if (m_listenfd > 0) { close(m_listenfd); m_listenfd=-1; }
if ( (m_listenfd = socket(AF_INET,SOCK_STREAM,0))<=0) return false;
signal(SIGPIPE,SIG_IGN);
int opt = 1; unsigned int len = sizeof(opt);
setsockopt(m_listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,len);
memset(&m_servaddr,0,sizeof(m_servaddr));
m_servaddr.sin_family = AF_INET;
m_servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
m_servaddr.sin_port = htons(port);
if (bind(m_listenfd,(struct sockaddr *)&m_servaddr,sizeof(m_servaddr)) != 0 )
{
CloseListen(); return false;
}
if (listen(m_listenfd,backlog) != 0 )
{
CloseListen(); return false;
}
return true;
}
bool CTcpServer::Accept()
{
if (m_listenfd==-1) return false;
m_socklen = sizeof(struct sockaddr_in);
if ((m_connfd=accept(m_listenfd,(struct sockaddr *)&m_clientaddr,(socklen_t*)&m_socklen)) < 0)
return false;
return true;
}
char *CTcpServer::GetIP()
{
return(inet_ntoa(m_clientaddr.sin_addr));
}
bool CTcpServer::Read(char *buffer,const int itimeout)
{
if (m_connfd==-1) return false;
if (itimeout>0)
{
struct pollfd fds;
fds.fd=m_connfd;
fds.events=POLLIN;
m_btimeout=false;
int iret;
if ( (iret=poll(&fds,1,itimeout*1000)) <= 0 )
{
if (iret==0) m_btimeout = true;
return false;
}
}
m_buflen = 0;
return(TcpRead(m_connfd,buffer,&m_buflen));
}
bool CTcpServer::Write(const char *buffer,const int ibuflen)
{
if (m_connfd==-1) return false;
int ilen = ibuflen;
if (ilen==0) ilen=strlen(buffer);
return(TcpWrite(m_connfd,buffer,ilen));
}
void CTcpServer::CloseListen()
{
if (m_listenfd > 0)
{
close(m_listenfd); m_listenfd=-1;
}
}
void CTcpServer::CloseClient()
{
if (m_connfd > 0)
{
close(m_connfd); m_connfd=-1;
}
}
CTcpServer::~CTcpServer()
{
CloseListen(); CloseClient();
}
读写操作函数
bool TcpRead(const int sockfd,char *buffer,int *ibuflen,const int itimeout)
{
if (sockfd==-1) return false;
if (itimeout>0)
{
struct pollfd fds;
fds.fd=sockfd;
fds.events=POLLIN;
if ( poll(&fds,1,itimeout*1000) <= 0 ) return false;
}
if (itimeout==-1)
{
struct pollfd fds;
fds.fd=sockfd;
fds.events=POLLIN;
if ( poll(&fds,1,0) <= 0 ) return false;
}
(*ibuflen) = 0;
if (Readn(sockfd,(char*)ibuflen,4) == false) return false;
(*ibuflen)=ntohl(*ibuflen);
if (Readn(sockfd,buffer,(*ibuflen)) == false) return false;
return true;
}
bool TcpWrite(const int sockfd,const char *buffer,const int ibuflen)
{
if (sockfd==-1) return false;
int ilen=0;
if (ibuflen==0) ilen=strlen(buffer);
else ilen=ibuflen;
int ilenn=htonl(ilen);
char TBuffer[ilen+4];
memset(TBuffer,0,sizeof(TBuffer));
memcpy(TBuffer,&ilenn,4);
memcpy(TBuffer+4,buffer,ilen);
if (Writen(sockfd,TBuffer,ilen+4) == false) return false;
return true;
}
bool Readn(const int sockfd,char *buffer,const size_t n)
{
int nLeft=n;
int idx=0;
int nread;
while(nLeft > 0)
{
if ( (nread=recv(sockfd,buffer+idx,nLeft,0)) <= 0) return false;
idx=idx+nread;
nLeft=nLeft-nread;
}
return true;
}
bool Writen(const int sockfd,const char *buffer,const size_t n)
{
int nLeft=n;
int idx=0;
int nwritten;
while(nLeft > 0 )
{
if ( (nwritten=send(sockfd,buffer+idx,nLeft,0)) <= 0) return false;
nLeft=nLeft-nwritten;
idx=idx+nwritten;
}
return true;
}
CTcpClient类实现socket通信的客户端
int main(int argc,char *argv[])
{
CTcpClient TcpClient;
if (TcpClient.ConnectToServer("172.17.0.15",5858)==false)
{
printf("TcpClient.ConnectToServer(\"172.17.0.15\",5858) failed.\n"); return -1;
}
char strbuffer[1024];
for (int ii=0;ii<5;ii++)
{
memset(strbuffer,0,sizeof(strbuffer));
snprintf(strbuffer,50,"这是第%d个超级女生,编号%03d。",ii+1,ii+1);
printf("发送:%s\n",strbuffer);
if (TcpClient.Write(strbuffer)==false) break;
memset(strbuffer,0,sizeof(strbuffer));
if (TcpClient.Read(strbuffer,20)==false) break;
printf("接收:%s\n",strbuffer);
sleep(1);
}
}
CTcpServer类实现socket通信的服务端
int main(int argc,char *argv[])
{
CTcpServer TcpServer;
if (TcpServer.InitServer(5858)==false)
{
printf("TcpServer.InitServer(5858) failed.\n"); return -1;
}
if (TcpServer.Accept()==false)
{
printf("TcpServer.Accept() failed.\n"); return -1;
}
printf("客户端(%s)已连接。\n",TcpServer.GetIP());
char strbuffer[1024];
while (true)
{
memset(strbuffer,0,sizeof(strbuffer));
if (TcpServer.Read(strbuffer,300)==false) break;
printf("接收:%s\n",strbuffer);
strcat(strbuffer,"ok");
printf("发送:%s\n",strbuffer);
if (TcpServer.Write(strbuffer)==false) break;
}
printf("客户端已断开。\n");
}