Https 如何使用阻塞套接字超时持久/保持活动SSL连接?
询问更改一行代码是否实现了持久SSL连接。在看到该问题的回答并检查SSL文档的缺乏情况后,以下内容似乎是正确的:Https 如何使用阻塞套接字超时持久/保持活动SSL连接?,https,openssl,winsock,keep-alive,Https,Openssl,Winsock,Keep Alive,询问更改一行代码是否实现了持久SSL连接。在看到该问题的回答并检查SSL文档的缺乏情况后,以下内容似乎是正确的: 对于服务器,持久连接只是在SSL_accept()和SSL_set_shutdown()之间重复执行请求/响应 根据,客户端必须通过发送适当的“Content length:”标头或使用商定的终止请求来指示将有多少请求 但是,不能保证客户会发送它应该发送的内容。因此,使用阻塞套接字的服务器似乎可以无限期地挂起SSL_read(),同时等待永远不会到达的其他请求。(SSL_CTX_
- 对于服务器,持久连接只是在SSL_accept()和SSL_set_shutdown()之间重复执行请求/响应
- 根据,客户端必须通过发送适当的“Content length:”标头或使用商定的终止请求来指示将有多少请求
while TRUE do
begin // wait for incoming TCP connection
if notzero(listen(listen_socket, 100)) then continue; // listen failed
client_len := SizeOf(sa_cli);
sock := accept(listen_socket, @sa_cli, @client_len); // create socket for connection
if sock = INVALID_SOCKET then continue; // accept failed
ssl := SSL_new(ctx); // TCP connection ready, create ssl structure
if assigned(ssl) then
begin
SSL_set_fd(ssl, sock); // assign socket to ssl structure
if SSL_accept(ssl) = 1 then // handshake worked
begin
request := '';
repeat // gather request
bytesin := SSL_read(ssl, buffer, sizeof(buffer)-1);
if bytesin > 0 then
begin
buffer[bytesin] := #0;
request := request + buffer;
end;
until SSL_pending(ssl) <= 0;
if notempty(request) then
begin // decide on response, avoid keep-alive
response := 'HTTP/1.0 200 OK'#13#10'Connection: Close'#13#10 + etc;
SSL_write(ssl, pchar(response)^, length(response));
end; // else read empty or failed
end; // else handshake failed
SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN or SSL_RECEIVED_SHUTDOWN);
CloseSocket(sock);
SSL_free(ssl);
end; // else ssl creation failed
end; // infinite while
为TRUE时执行
开始//等待传入的TCP连接
如果不是零(侦听(侦听套接字,100)),则继续;//监听失败
客户机名称:=SizeOf(sa_cli);
sock:=接受(侦听套接字、@sa_cli、@client_len);//为连接创建套接字
如果sock=无效的_SOCKET,则继续;//接受失败
ssl:=ssl_new(ctx);//TCP连接就绪,创建ssl结构
如果已分配(ssl),则
开始
SSL_set_fd(SSL,sock);//将套接字分配给ssl结构
如果SSL_accept(SSL)=1,则//握手有效
开始
请求:='';
重复//收集请求
bytesin:=SSL_read(SSL,buffer,sizeof(buffer)-1);
如果bytesin>0,则
开始
缓冲区[bytesin]:=#0;
请求:=请求+缓冲区;
结束;
在SSL_pending(SSL)(1)之前,如果客户端连接但不发送请求(例如DoS攻击),则SSL_read()将挂起
(2) 尝试在接受的套接字上调用setsockopt(SO\u RCVTIMEO)
来设置读取超时。引用“确保避免无限阻塞的唯一方法是使用非阻塞I/O。”因此,我想我将放弃对阻塞的SSL\u read()超时的尝试