Https 当从服务器返回图片时,使用openssl的libwebsockets看起来很慢
我正在使用libwebsockets开发一个小型服务,用于连接浏览器和我的服务。当它在http中工作时,一切都正常。但当我使用openssl切换到https时,效果很差。例如,当我在浏览器中单击超链接时,我的服务将返回一张图片。但是它工作得很慢。在执行此操作时,我的cpu大约运行50%。我只是糊涂了,需要你的帮助。非常感谢~主要代码如下所示:Https 当从服务器返回图片时,使用openssl的libwebsockets看起来很慢,https,openssl,libwebsockets,Https,Openssl,Libwebsockets,我正在使用libwebsockets开发一个小型服务,用于连接浏览器和我的服务。当它在http中工作时,一切都正常。但当我使用openssl切换到https时,效果很差。例如,当我在浏览器中单击超链接时,我的服务将返回一张图片。但是它工作得很慢。在执行此操作时,我的cpu大约运行50%。我只是糊涂了,需要你的帮助。非常感谢~主要代码如下所示: case LWS_CALLBACK_HTTP: /* check for the "send a big file by hand" examp
case LWS_CALLBACK_HTTP:
/* check for the "send a big file by hand" example case */
sprintf(cache_file, "%s\\%s", g_cache_path, (char*)in+1);
n = GetLastIndex(cache_file, '/');
if (n >= 0)
{
cache_file[n] = '\\';
}
p = buffer;
// cache_file is my file name , should be transfer
pss->hFile = CreateFile(cache_file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (pss->hFile == NULL || pss->hFile == INVALID_HANDLE_VALUE)
return -1;
//fstat(pss->hFile, &stat_buf);
/*
* we will send a big jpeg file, but it could be
* anything. Set the Content-Type: appropriately
* so the browser knows what to do with it.
*/
p += sprintf((char *)p,
"HTTP/1.0 200 OK\x0d\x0a"
"Server: libwebsockets\x0d\x0a"
"Content-Type: image/png\x0d\x0a"
"Content-Length: %u\x0d\x0a\x0d\x0a",
GetFileSize(pss->hFile, 0));
/*
* send the http headers...
* this won't block since it's the first payload sent
* on the connection since it was established
* (too small for partial)
*/
n = libwebsocket_write(wsi, buffer,
p - buffer, LWS_WRITE_HTTP);
if (n < 0) {
CloseHandle(pss->hFile);
return -1;
}
/*
* book us a LWS_CALLBACK_HTTP_WRITEABLE callback
*/
libwebsocket_callback_on_writable(context, wsi);
break;
case LWS_CALLBACK_HTTP_WRITEABLE:
do {
ReadFile(pss->hFile, buffer, sizeof buffer, &readLen, NULL);
if (readLen <= 0)
goto bail;
m = libwebsocket_write(wsi, buffer, readLen, LWS_WRITE_HTTP);
if (m < 0)
/* write failed, close conn */
goto bail;
if (m != readLen)
/* partial write, adjust */
SetFilePointer(pss->hFile, m - readLen, 0, FILE_CURRENT);
} while (!lws_send_pipe_choked(wsi));
libwebsocket_callback_on_writable(context, wsi);
break;
case LWS\u CALLBACK\u HTTP:
/*检查“手动发送大文件”示例案例*/
sprintf(缓存文件,“%s\\%s”,g\u缓存路径,+1中的字符*);
n=GetLastIndex(缓存文件“/”);
如果(n>=0)
{
缓存文件[n]='\\';
}
p=缓冲区;
//cache_file是我的文件名,应该是传输
pss->hFile=CreateFile(缓存文件、通用文件读取、文件共享文件读取、NULL、打开文件、文件标志、顺序文件扫描、NULL);
如果(pss->hFile==NULL | | pss->hFile==INVALID_HANDLE_值)
返回-1;
//fstat(pss->hFile和stat_buf);
/*
*我们将发送一个大的jpeg文件,但它可能是
*什么都行。设置内容类型:适当
*因此浏览器知道如何处理它。
*/
p+=sprintf((char*)p,
“HTTP/1.0 200正常\x0d\x0a”
“服务器:libwebsockets\x0d\x0a”
“内容类型:image/png\x0d\x0a”
“内容长度:%u\x0d\x0a\x0d\x0a”,
GetFileSize(pss->hFile,0);
/*
*发送http头。。。
*这不会阻塞,因为它是发送的第一个有效负载
*关于建立以来的联系
*(太小,不适合局部使用)
*/
n=libwebsocket_写入(wsi、缓冲区、,
p-缓冲区,LWS\u写入\u HTTP);
if(n<0){
关闭手柄(pss->hFile);
返回-1;
}
/*
*为我们预订LWS\u回调\u HTTP\u可写回调
*/
libwebsocket_回调_on_writable(上下文,wsi);
打破
案例LWS\u回调\u HTTP\u可写:
做{
ReadFile(pss->hFile,buffer,sizeof buffer,&readLen,NULL);
if(readLen-hFile,m-readLen,0,当前文件);
}而(!lws_发送_管道_阻塞(wsi));
libwebsocket_回调_on_writable(上下文,wsi);
打破
这与OpenSSL有什么关系?返回一个BOOL
。如果失败,那么您不应该使用readLen
。是的,这是真的。我在这里更改了代码,thx~但这并不是它在chrome中返回如此缓慢的原因,因为它在IE和firefox中看起来很好