gpt4 book ai didi

c++ - 服务器和多个客户端使用 pthreads 和 select()

转载 作者:行者123 更新时间:2023-11-28 05:37:53 25 4
gpt4 key购买 nike

考虑下一段代码-

int get_ready_connection(int s) {
/* socket of connection */
int caller;
if ((caller = accept(s,NULL,NULL)) < SUCCESS)
{
server_log->write_to_log(sys_call_error(SERVER, "accept"));
return FAILURE;
}

return caller;
}


int establish_connection(sockaddr_in& connection_info)
{
// Create socket
if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) < SUCCESS)
{
server_log->write_to_log(sys_call_error(SERVER, "socket"));
return FAILURE;
}

// Bind `sock` with given addresses
if (bind(server_sock, (struct sockaddr *) &connection_info, \
sizeof(struct sockaddr_in)) < SUCCESS)
{
close(server_sock);
server_log->write_to_log(sys_call_error(SERVER, "bind"));
return FAILURE;
}

// Max # of queued connects
if (listen(server_sock, MAX_PENDING_CONNECTIONS) < SUCCESS)
{
server_log->write_to_log(sys_call_error(SERVER, "listen"));
return FAILURE;
}

// Create a set of file descriptors and empty it.
fd_set set;
bool is_inside;
int ret_val;

while(true)
{
FD_ZERO(&set);

FD_SET(STDIN_FILENO, &set);
FD_SET(server_sock, &set);

struct timeval tv = {2, 0};

ret_val = select(server_sock + 1, &set, NULL, NULL, &tv); // TODO ret_val

is_inside = FD_ISSET(STDIN_FILENO, &set);
if(is_inside)
{
// get user input
string user_input;
getline(cin, user_input);

if ((strcasecmp(user_input.c_str(), EXIT_TEXT) == 0))
{
return SUCCESS;
}
}

is_inside = FD_ISSET(server_sock, &set);
if(is_inside)
{
// get the first connection request
int current_connection = get_ready_connection(server_sock);
if (current_connection == FAILURE) {
free_allocated_memory();
exit_write_close(server_log, sys_call_error(SERVER, "accept"),
ERROR);
}

// if exit was not typed by the server's stdin, process the request
pthread_t thread;

// create thread
if (pthread_create(&thread, NULL, command_thread_func, &current_connection) != 0)
{
free_allocated_memory();
exit_write_close(server_log, sys_call_error(SERVER, "pthread_create"), ERROR);
}
}
}
}

我试图做的就是“监听”STDIN,让用户在服务器的 shell 中键入“EXIT”,并等待客户端从他们的 shell 传递命令(每次服务器从用户,服务器解析它,服务器创建一个线程来处理命令的执行)为了同时进行,我使用了 select()。

当我使用单线程时,一切都很完美。但问题是当我连接另一个客户端时出现段错误。我怀疑问题就在这里。有什么建议吗?

最佳答案

很难知道这是否是您的确切问题,但这绝对是问题:

您不能调用 pthread_create 并提供指向堆栈变量 (&current_connection) 的指针作为线程函数的参数。一方面,一旦父级退出该范围,它就会立即销毁。

其次,它将在下次调用 get_ready_connection 时被覆盖。

关于c++ - 服务器和多个客户端使用 pthreads 和 select(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37822734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com