分段 C++类网络编程的错误
Segmentation Fault with C++ class network programming
我正在尝试编写一个 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 Clientn", 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 socketsn";
}
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声明为指针,但从不设置它指向的内容。 当您尝试在指针的位置放置一个值(带有接受调用的结果)时,它正在写入内存中的某个随机位置,这可能会导致也可能不会导致立即崩溃(在此版本的代码中,它会导致崩溃),但总是非常糟糕。
让new_socket_desc成为类的常规 int 成员,在创建线程时使用 & 运算符,否则不要在上面使用 * 运算符,你应该有更好的运气。
int *new_socket_desc;
// ....
*new_socket_desc = accept(socket_desc ....
您将new_socket_desc声明为单位化指针,然后将accept
的结果分配给new_socket_desc
指向的随机内存位置。所以很明显,这会导致SEGFAULT。你应该做:
int new_socket_desc;
// ....
new_socket_desc = accept(socket_desc ....
相关文章:
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- 用C++/C进行安全网络编程
- 网络编程.确定消息的结尾
- 分段 C++类网络编程的错误
- 我可以使用Boost::Asio而不用担心网络编程问题吗?
- 开始使用p2p类型的网络/编程
- 需要一个在C/C++或Python中进行HTTP/HTML网络编程的库
- C2059 'return'错误,编程新手,有人可以看看这个吗?
- 何时在网络编程中使用 ntohs 函数
- 我应该用C++进行网络编程吗
- 用Active Directory进行C++网络编程
- 网络编程基础知识,需要帮助了解addrinfo/sockaddr_instructs的用法等
- 如何使用c++网络编程进行数据交换
- 我如何开始在网络编程
- 我如何开始与跨平台网络编程
- 网络编程-如何在C++中创建UDP套接字的示例
- "#pragma pack"在网络编程中的作用是什么
- c++网络编程
- 网络编程- c++网络库需要内核堆栈
- 在Qt中开始网络编程