【发布时间】:2017-02-10 10:01:12
【问题描述】:
我有一个使用 sys/socket 和 OpenSSL 设置的简单套接字服务器。对于每个连接,客户端都需要向服务器发送消息,接收响应,然后回复该响应。
我找不到任何明确的机制来使这些套接字成为非阻塞的?系统必须能够同时处理多个套接字...
我用于监听连接的服务器代码:
while(1)
{
struct sockaddr_in addr;
uint len = sizeof(addr);
SSL *ssl;
int client = accept(sock, (struct sockaddr*)&addr, &len);
if (client > 0)
{
std::cout<<"Client accepted..."<<std::endl;
}
else
{
perror("Unable to accept");
exit(EXIT_FAILURE);
}
ssl = SSL_new(ctx);
SSL_set_fd(ssl, client);
if (SSL_accept(ssl) <= 0)
{
std::cout<<"ERROR"<<std::endl;
}
else
{
char buff[1024];
SSL_read(ssl, buff, 1024);
std::cout<<buff<<std::endl;
std::string reply="Thanks from the server";
char buff_response[1024];
reply.copy(buff_response, 1024);
const void *buf=&buff_response;
SSL_write(ssl, buf, 1024);
char another_buff[1024];
SSL_read(ssl,another_buff,1024);
std::cout<<another_buff<<std::endl;
}
}
我查看了“select()”,但这似乎不允许并发,但允许系统知道何时释放套接字?
有人有解决这个基本问题的经验吗?
【问题讨论】:
-
我认为你应该再看看 select 。它不是关于释放套接字,而是关于检测是否有新数据可用以及是否可以写入数据,即正是你需要的。由于 SSL 套接字和选择比普通套接字和选择要复杂一些,我建议您从更简单的情况开始,然后在研究 How to handle OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE on non-blocking sockets 和其他资源之后添加 SSL。
-
您不需要非阻塞模式来同时处理多个客户端,并且O_NONBLOCK机制定义得非常好。不清楚你在问什么。