我使用select()
和OPENSSL在通用TCP服务器上打开多个套接字。我有一个非常标准的设置,使用一组文件描述符,然后使用
int sd = client_socket[id];
/* Add new socket to array of sockets */
for (i = 0; i < MAX_CONNECTIONS; i++) {
/* If position is empty */
if (client_socket[i] == 0) {
client_socket[i] = new_socket;
client_ssl_sockets[i] = *ssl; //save ssl object to array
break;
}
}
我想要做的是从客户端发出命令以强制关闭另一个客户端的套接字。我目前正在使用
void kill_socket(int id) {
close(client_socket[id]);
client_socket[id] = 0;
}
不幸的是,上面只是关闭我的套接字 - 即使我没有提供ID参数。是否有另一种方法可以引用套接字池中的特定套接字来隔离并使用已发出的命令将其关闭?
澄清编辑: 当我说另一个客户端发出的命令时,我指的是通过SSL_read接收的文本字符串,然后由switch语句使用:
ret_status = SSL_read(ssl, buf, MAX_BUF);
strncpy(pre, buf, 2); /* Pull first 2 characters of buffer */
strcpy(var, buf + 2); /* Pull rest of characters from buffer for function argument (where applicable) */
cmd = atoi(pre); /* Convert buffer prefix to integer for switch */
switch (cmd) {
...
}
然后我可以让客户端执行命令(甚至将参数传递给上面带有var
字符串的函数。
我看到的问题是close()
函数是在负责该特定套接字的for
循环内调用的,无法看到其他套接字。如何使套接字可见(和交互)到其他套接字?
编辑:根据@Remy
的请求调用kill_socket()
函数的switch语句
case 98: /* Disconnect node */
if (check_auth(client_ip[i]) == 1) {
printf("Closing client connection!\n\n");
kill_socket(atoi(var));
} else {
printf("You must authenticate first!\n\n");
}
break;