c++ - C++类网络编程的段错误

标签 c++ class networking pthreads segmentation-fault

我正在尝试编写一个使用类的 C++ 程序,启动并监听网络连接,然后为每个新客户端创建一个新线程。

幸运的是,我已经想出了如何从类内部生成线程,但是当尝试在类中执行 accept() 时,我遇到了段错误。我将发布代码,以便更轻松地显示我遇到问题的位置。

#include <iostream>
#include <string.h> //for memset
#include <pthread>
#include <sys/types.h> //network
#include <sys/socket.h> //network
#include <netinet/in.h> //network

using namespace std;
class network
{
  public:
    void my_listen();
    static void *handleClient(void * in_stream);
};

void* network::handleClient(void * in_stream)
{

  int *stream = reinterpret_cast<int *>(in_stream);
  write(*stream,"Hello Client\n", 12);
}

void network::my_listen()
{
  /*
   * Name: my_listen()
   * Purpose: Listens and accepts new connections. Once accpeted, a new thread
   *          is spun off. 
   * Input: none
   * Output: none
  */

  int *new_socket_desc;
  int port_num = 9876;
  socklen_t client_addr_len;

  int socket_desc = socket(AF_INET,SOCK_STREAM,0);

  sockaddr_in serv_addr, cli_addr;

  if(socket_desc == -1)
  {
    cerr << "Unable to create new sockets\n";
  }

  memset(&serv_addr, 0, sizeof(serv_addr));

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(port_num);

  if(bind(socket_desc, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
  {
    cerr << "Error on binding " << port_num << endl;
  }

  listen(socket_desc,5);

  client_addr_len = sizeof(cli_addr);

  pthread_t thread[10];
  int count = 0;

  *new_socket_desc = accept(socket_desc, (struct sockaddr *) &cli_addr, &client_addr_len); //Right here I segment fault

  cout << "Connected client " << " @ " << new_socket_desc << " (" << *new_socket_desc << ")" <<  endl;

  pthread_create(thread[0], handleClient, (void *)new_socket_desc);

  pthread_join(thread[0],NULL);
}

Main 没那么令人兴奋:

#include "network.h"
using namespace std;

int main()
{
  network my_network;

  my_network.my_listen();
}

有趣的是,我可以在不使用类的情况下让所有这些工作。我确定它与范围有关,但我不知道为什么。

顺便说一句,我在目标平台 x86_64 上使用 gcc 4.6.2

最佳答案

您将 new_socket_desc 声明为指针,但从未设置它指向的内容。当您尝试将一个值放在指针的位置(带有您的 accept 调用的结果)时,它正在写入内存中的某个随机位置,这可能会或可能不会导致立即崩溃(在您的代码版本中它是导致崩溃)但总是非常糟糕。

使 new_socket_desc 成为您类的常规 int 成员,在创建线程时在其上使用 & 运算符,否则不要在其上使用 * 运算符,您应该会有更好的运气。

关于c++ - C++类网络编程的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553052/

相关文章:

c++ - 友元函数无法访问私有(private)数据成员 (c++)

c++ - GCC#error 不会破坏进一步的编译

c++ - QML:文档完全加载时触发的事件

php - 添加服务提供者类后找不到类

python - 查找从客户端选择的端口的最佳方法

c++ - 如何从std::thread返回值

java - Jtabbedpane 使用多个类

c++ - 这种赋值方式叫什么?我的变量(值);

networking - OpenSSL:Wireshark 计数是 "Cipher Suites Length"还是从客户端传输到服务器的长度?

java - JDBC 中的连接是什么?