C++ c++;(sys/socket.h)客户端重试连接到服务器导致seg故障

C++ c++;(sys/socket.h)客户端重试连接到服务器导致seg故障,c++,sockets,c++14,C++,Sockets,C++14,已解决 多亏了用户4581301的评论,我开始检查所有的unique_ptr,发现destructor中的std::unique_ptr不正确 原创帖子: (为我糟糕的英语道歉) 我在C++中用CysServer系统构建了“sys/socket”,在那里“用户”启动服务器,客户端将“永远”运行。p> 我的意思是,无论服务器是否正在运行,客户端都会在一定的时间间隔内尝试连接到服务器。但是,当我这样做时,在第三次尝试连接到服务器时会出现分段错误。(是的,这可能是糟糕的服务器客户端设计) 因为此cen

已解决 多亏了用户4581301的评论,我开始检查所有的unique_ptr,发现destructor中的std::unique_ptr不正确

原创帖子:

(为我糟糕的英语道歉)

我在C++中用CysServer系统构建了“sys/socket”,在那里“用户”启动服务器,客户端将“永远”运行。p> 我的意思是,无论服务器是否正在运行,客户端都会在一定的时间间隔内尝试连接到服务器。但是,当我这样做时,在第三次尝试连接到服务器时会出现分段错误。(是的,这可能是糟糕的服务器客户端设计)

因为此cenario中不需要服务器,所以下面只显示了客户端的一部分:
client.cpp()

intmain(){
int端口=8888;
std::string adr=“127.0.0.1”;
bool run=true
std::唯一的ptr con;
while(运行){
con.重置(新插座适配器(adr,端口));
而(con->connected()){
//做事
}
}
}
类socketHandler{
公众:
SocketHandler(标准::字符串地址,int端口):
incommingMessageHandler(新MessageHandler())
,portNummer(港口)
,地址
{
如果((this->socketContainer=socket(AF\u INET,SOCK\u STREAM,0))<0){
出口(1);
}
memset(&this->servAddr,'0',sizeof(this->servAddr));
这->servAddr.sin\u family=AF\u INET;
this->servAddr.sin\u port=htons(this->portnumer);
if(inet_pton(AF_inet,this->address.c_str(),&this->servAddr.sin_addr)socketContainer,(struct sockaddr*)和this->servAddr,sizeof(this->servAddr))<0){
closeSocket();
返回;
}
//更多的东西
}
布尔连接(){
//如果从服务器接收到“测试消息”,则返回true。
}
//也跳过了一些函数
私人:
void closeSocket(){
关闭(此->socketContainer);
此->socketContainer=0;
}
国际港口;
std::字符串地址;
std::原子容器;
servAddr中的结构sockaddr_;
std::原子状态;
}
我觉得这是唯一一个有问题的“代码”,所以不是所有的东西都在那里,如果必要的话,我会给出更多

根据我在文档中找到的内容,我感觉哪里丢失了,以及我在sys/socket上所有联机示例中找到的内容,它们都会在失败的“connect()”调用中退出(1),但没有真正的原因

这里有人知道为什么会这样吗?和/或有办法“解决”这个问题

一些链接: - - -

谢谢你的帮助

解决方案:

私密(seg故障析构函数):

intmain(){
int端口=8888;
std::string adr=“127.0.0.1”;
bool run=true
std::唯一的ptr con;
while(运行){
con.重置(新插座适配器(adr,端口));
而(con->connected()){
//做事
}
}
}
类socketHandler{
公众:
SocketHandler(标准::字符串地址,int端口):
incommingMessageHandler(新MessageHandler())
,portNummer(港口)
,地址
{
如果((this->socketContainer=socket(AF\u INET,SOCK\u STREAM,0))<0){
出口(1);
}
memset(&this->servAddr,'0',sizeof(this->servAddr));
这->servAddr.sin\u family=AF\u INET;
this->servAddr.sin\u port=htons(this->portnumer);
if(inet_pton(AF_inet,this->address.c_str(),&this->servAddr.sin_addr)socketContainer,(struct sockaddr*)和this->servAddr,sizeof(this->servAddr))<0){
closeSocket();
返回;
}
重置(新std::thread(&ClientSocketHandler::receiveMessagesFromSocket,this));
}
布尔连接(){
//如果从服务器接收到“测试消息”,则返回true。
}
void receiveMessagesFromSocket(){
//如果输入消息,请添加messagehandler…(线程运行时)
}
~sockethandler(){
/**
*这导致了SEG故障(显然,在考虑时)
*/
while(true){
if(this->msgRecvThrd->joinable()){
此->msgRecvThrd->join();
打破
}
}
}
//也跳过了一些函数
私人:
void closeSocket(){
关闭(此->socketContainer);
此->socketContainer=0;
}
国际港口;
std::字符串地址;
std::原子容器;
servAddr中的结构sockaddr_;
std::原子状态;
std::unique_ptr incommmingMessageHandler;
std::唯一的\u ptr msgRecvThrd;
}
修复seg故障的析构函数:

int main(){
  int port = 8888;
  std::string adr = "127.0.0.1";
  bool run = true
  std::unique_ptr<socketHandler> con;

  while(run){
     con.reset(new socketHandler(adr, port));
     while(con->connected()){
       // do stuff
     }
  }
}

class socketHandler{
public:
   socketHandller(std::string address, int port):
   incommingMessageHandler(new MessageHandler())
    , portNummer(port)
    , address(address)
   {
      if( (this->socketContainer = socket(AF_INET, SOCK_STREAM, 0)) < 0){
         exit(1);
      }

      memset(&this->servAddr, '0', sizeof(this->servAddr));
      this->servAddr.sin_family = AF_INET;
      this->servAddr.sin_port = htons(this->portNummer);

      if( inet_pton(AF_INET, this->address.c_str(), &this->servAddr.sin_addr) <= 0){
         exit(1);
      }

      /**
       * The third time this "connect" is "excuted" I get seg fault
       * if it failed on the two first. It does not even call the 
       * "closeSocket" function.
      */
      if(connect(this->socketContainer, (struct sockaddr*)&this->servAddr, sizeof(this->servAddr)) < 0){
         closeSocket();
         return; 
      }

      msgRecvThrd.reset(new std::thread(&ClientSocketHandler::receiveMessagesFromSocket, this));
   }

   bool connected(){
     // return true if "test-message" been received from server.
   }

   void receiveMessagesFromSocket(){
      // if incomming message add the messagehandler... (while thread running)
   }

   ~socketHandller(){
      /**
      * FIXED
      */
      while(this->msgRecvThrd != nullptr){
         if(this->msgRecvThrd->joinable()){
           this->msgRecvThrd->join();
           this->msgRecvThrd.reset();
         }
      }
   }


   // skiped some functions as well

private:
    void closeSocket(){
       close(this->socketContainer);
       this->socketContainer = 0;
    }

   int portNummer;
   std::string address;
   std::atomic<int> socketContainer;
   struct sockaddr_in servAddr;
   std::atomic<bool> connectStatus;
   std::unique_ptr<MessageHandler> incommingMessageHandler;
   std::unique_ptr<std::thread> msgRecvThrd;
}
intmain(){
int端口=8888;
std::string adr=“127.0.0.1”;
bool run=true
std::唯一的ptr con;
while(运行){
con.重置(新插座适配器(adr,端口));
而(con->connected()){
//做事
}
}
}
类socketHandler{
公众:
SocketHandler(标准::字符串地址,int端口):
incommingMessageHandler(新MessageHandler())
,portNummer(港口)
,地址
{
如果((this->socketContainer=socket(AF\u INET,SOCK\u STREAM,0))<0){
出口(1);
}
memset(&this->servAddr,'0',sizeof(this->servAddr));
这->servAddr.sin\u family=AF\u INET;
this->servAddr.sin\u port=htons(this->portnumer);
if(inet_pton(AF_inet,this->address.c_str(),&this->servAddr.sin_addr)socketContainer,(struct sockaddr*)和this->servAddr,sizeof(this->servAddr))<0){
closeSocket();
返回;
}
重置(新std::thread(&ClientSocketHandler::receiveMessagesFromSocket,this));
}
布尔连接(){
//如果从服务器接收到“测试消息”,则返回true。
}
void receiveMessagesFromSocket(){
//如果输入消息,请添加messagehandler…(线程运行时)
}
~sockethandler(){
/**
*固定的
*/
while(this->msgRecvThrd!=nullptr){
if(this->msgRecvThrd->joinable()){
此->msgRecvThrd->join();
此->msgRecvThrd.reset();
}
}
}
//
int main(){
  int port = 8888;
  std::string adr = "127.0.0.1";
  bool run = true
  std::unique_ptr<socketHandler> con;

  while(run){
     con.reset(new socketHandler(adr, port));
     while(con->connected()){
       // do stuff
     }
  }
}

class socketHandler{
public:
   socketHandller(std::string address, int port):
   incommingMessageHandler(new MessageHandler())
    , portNummer(port)
    , address(address)
   {
      if( (this->socketContainer = socket(AF_INET, SOCK_STREAM, 0)) < 0){
         exit(1);
      }

      memset(&this->servAddr, '0', sizeof(this->servAddr));
      this->servAddr.sin_family = AF_INET;
      this->servAddr.sin_port = htons(this->portNummer);

      if( inet_pton(AF_INET, this->address.c_str(), &this->servAddr.sin_addr) <= 0){
         exit(1);
      }

      /**
       * The third time this "connect" is "excuted" I get seg fault
       * if it failed on the two first. It does not even call the 
       * "closeSocket" function.
      */
      if(connect(this->socketContainer, (struct sockaddr*)&this->servAddr, sizeof(this->servAddr)) < 0){
         closeSocket();
         return; 
      }

      msgRecvThrd.reset(new std::thread(&ClientSocketHandler::receiveMessagesFromSocket, this));
   }

   bool connected(){
     // return true if "test-message" been received from server.
   }

   void receiveMessagesFromSocket(){
      // if incomming message add the messagehandler... (while thread running)
   }

   ~socketHandller(){
      /**
      * THIS CAUSED THE SEG FAULT (obviouse, when thinking about it)
      */
      while(true){
         if(this->msgRecvThrd->joinable()){
           this->msgRecvThrd->join();
           break;
         }
      }
   }


   // skiped some functions as well

private:
    void closeSocket(){
       close(this->socketContainer);
       this->socketContainer = 0;
    }

   int portNummer;
   std::string address;
   std::atomic<int> socketContainer;
   struct sockaddr_in servAddr;
   std::atomic<bool> connectStatus;
   std::unique_ptr<MessageHandler> incommingMessageHandler;
   std::unique_ptr<std::thread> msgRecvThrd;
}
int main(){
  int port = 8888;
  std::string adr = "127.0.0.1";
  bool run = true
  std::unique_ptr<socketHandler> con;

  while(run){
     con.reset(new socketHandler(adr, port));
     while(con->connected()){
       // do stuff
     }
  }
}

class socketHandler{
public:
   socketHandller(std::string address, int port):
   incommingMessageHandler(new MessageHandler())
    , portNummer(port)
    , address(address)
   {
      if( (this->socketContainer = socket(AF_INET, SOCK_STREAM, 0)) < 0){
         exit(1);
      }

      memset(&this->servAddr, '0', sizeof(this->servAddr));
      this->servAddr.sin_family = AF_INET;
      this->servAddr.sin_port = htons(this->portNummer);

      if( inet_pton(AF_INET, this->address.c_str(), &this->servAddr.sin_addr) <= 0){
         exit(1);
      }

      /**
       * The third time this "connect" is "excuted" I get seg fault
       * if it failed on the two first. It does not even call the 
       * "closeSocket" function.
      */
      if(connect(this->socketContainer, (struct sockaddr*)&this->servAddr, sizeof(this->servAddr)) < 0){
         closeSocket();
         return; 
      }

      msgRecvThrd.reset(new std::thread(&ClientSocketHandler::receiveMessagesFromSocket, this));
   }

   bool connected(){
     // return true if "test-message" been received from server.
   }

   void receiveMessagesFromSocket(){
      // if incomming message add the messagehandler... (while thread running)
   }

   ~socketHandller(){
      /**
      * FIXED
      */
      while(this->msgRecvThrd != nullptr){
         if(this->msgRecvThrd->joinable()){
           this->msgRecvThrd->join();
           this->msgRecvThrd.reset();
         }
      }
   }


   // skiped some functions as well

private:
    void closeSocket(){
       close(this->socketContainer);
       this->socketContainer = 0;
    }

   int portNummer;
   std::string address;
   std::atomic<int> socketContainer;
   struct sockaddr_in servAddr;
   std::atomic<bool> connectStatus;
   std::unique_ptr<MessageHandler> incommingMessageHandler;
   std::unique_ptr<std::thread> msgRecvThrd;
}