#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <thread>
#include <list>
#ifndef SOCKETDEMO_CTCPSERVER_H
#define SOCKETDEMO_CTCPSERVER_H
class CTcpServer{
public:
int m_listenfd;
std::list<int> m_clientfds;
CTcpServer();
bool initServer();
int Accept();
int Send(int fd,void *buff, int bufflen);
int Recv(int fd,void *buff, int bufflen);
void listenClose();
void clientClose(int fd);
~CTcpServer();
};
#endif
#include "CTcpServer.h"
CTcpServer::CTcpServer(){
m_listenfd = 0;
}
CTcpServer::~CTcpServer(){
if(m_listenfd!=0) close(m_listenfd);
auto it = m_clientfds.begin();
while (it != m_clientfds.end()) {
close(*it);
++it;
}
}
bool CTcpServer::initServer(){
if (m_listenfd!=0) { close(m_listenfd); m_listenfd=0; }
m_listenfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in servaddr;
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8000);
if (bind(m_listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0 )
{close(m_listenfd); m_listenfd=0; return false;}
if (listen(m_listenfd,5) != 0 ) { close(m_listenfd); m_listenfd=0; return false; }
return true;
}
int CTcpServer::Accept(){
int clientfd = accept(m_listenfd, NULL, 0);
if(clientfd == -1) return clientfd;
m_clientfds.push_back(clientfd);
return clientfd;
}
int CTcpServer::Send(int fd, void *buff, int bufflen){
return send(fd, buff, bufflen, 0);
}
int CTcpServer::Recv(int fd, void *buff, int bufflen){
return recv(fd, buff, bufflen, 0);
}
void CTcpServer::listenClose(){
if (m_listenfd!=0) { close(m_listenfd); m_listenfd=0;}
}
void CTcpServer::clientClose(int fd){
if (fd!=0) { close(fd);}
}
#include <iostream>
#include "CTcpServer.h"
int main()
{
CTcpServer tcpserver;
if(tcpserver.initServer() == false) {printf("init server error\n"); return false;}
while(1){
int fd = tcpserver.Accept();
if(fd == -1) continue;
printf("##############server start###############\n");
std::thread t([&tcpserver, fd]() {
char buff[1024+1] = {0};
while(tcpserver.Recv(fd,buff, sizeof(buff)) > 0){
printf("server recv: %s\n", buff);
strcat(buff, "---@ok");
tcpserver.Send(fd,buff, strlen(buff));
memset(buff, 0x00, sizeof(buff));
printf("----------------------------------------\n");
}
});
t.detach();
}
return 0;
}