我正在尝试/考虑使CppCMS - C++ Web Framework项目更加跨平台.
今天我可以轻松支持Linux,OpenSolaris,FreeBSD甚至Cygwin.但是当涉及Native Windows时,它变得非常痛苦:
情况概述:
这是一个使用在Unix世界中流行的API的Web项目,例如:在大多数UNIX Web服务器中实现的CGI,FastCGI和SCGI; 但我知道我无法在IIS中使用它,因为它不支持TCP/IP上的FastCGI(仅限Windows管道).
因此,即使它可以工作,它也可能仅在Apache的Windows端口上运行.
我在POSIX API上大量接力:
底线:
有很多非常重要的工作要做,即使它完成了,它可能只适用于MingW工具而不是Windows程序员熟悉的" 本机 "工具.
所以,我的问题是:
编辑:
对我来说,了解有多少Windows开发人员更喜欢使用开源开发工具MingW而不是像VS这样的Microsoft开发解决方案,这一点也很重要.
编辑#2:关于"原生"Windows解决方案和IIS的清除.
事实上,用IIS运行框架确实很难.我解释:
该项目与标准 Web服务器API相关,如FastCGI或SCGI,允许通过sinlge套接字接受许多请求.因此,在应用程序方面,我接受新请求继续它并返回答案.有时几个线程处理多个请求.
因此,实现一个或两个标准协议我打开与任何现有服务器的通信:Apache,lighttpd,nginx,cherokee ......或任何其他服务器; 除了IIS之外
IIS具有FastCGI的实现,但是......它仅支持每个本地进程的1个连接,仅由Web服务器控制...
所以...绝对没有标准的方法将我的应用程序连接到IIS.
请注意,我实现了标准的 Web服务器API,我没有实现既不是IIS专有的ISAPI也不是Apache专有的API,即使是第二个更重要的是针对UNIX世界.
所以,只是Windows IIS Web世界还没有为这样的项目做好合作准备,所以如果有人在Windows下使用它,它会将它用于更开放的Web服务器.
所有优秀的C++程序员都知道如何避免泄漏内存(或套接字等资源):
std::auto_ptr, boost::shared_ptr.但是,内存泄漏仍然会发生.当您在程序中发现内存泄漏时,即使您使用上述技术,也要指出最常见的问题.
我开始:
有时您忘记将基类的析构函数定义为虚拟.所以派生类引用的所有派生类都没有被正确销毁并因此泄露.
Boost.Asio 是一个很棒的库,但它有一个巨大的缺点——编译时间极慢。一个简单的HTTP协议实现(真的很简单)(大约1k行代码)在GCC 4.4下编译需要大约13.5s!
我尝试使用 PCH,但它并没有太多地改善编译时间(大约仅 1 秒)。
那么有没有关于如何使 Boost.Asio 编译时间更快的教程?
例如,我应该为哪个类准确包含哪些标头。
例如,我使用:io_service、tcp::ip::sockets、tcp::ip::acceptor、deadline_timer、 缓冲区和一些函数,如async_read、async_write。
有什么建议么?
PS:只要有可能,我都会使用 pimpl。
我正在使用epoll/devpoll/kqueue/poll/select(包括windows-select)设计异步套接字IO的事件循环.
我有两个执行IO操作的选项:
非阻止模式,在EAGAIN上进行调查
轮询模式:轮询然后执行
对我来说,在普通模式下使用时,首先需要较少的系统调用,特别是对于写入套接字(缓冲区非常大).此外,它似乎可以减少"选择"执行次数的开销,尤其是当你没有像epoll/devpoll/kqueue那样可以扩展的东西时,它会很好.
问题:
注意:请不要建议使用现有的event-loop/socket-api实现
根据RFC 2109,2965 cookie的值可以是HTTP令牌或带引号的字符串,而令牌不能包含非ASCII字符.
但是我发现Firefox浏览器(3.0.6)按原样发送带有utf-8字符串的cookie,我测试的三个Web服务器(apache2,lighttpd,nginx)按原样将该字符串传递给应用程序.
例如,来自浏览器的原始请求:
$ nc -l -p 8080
GET /hello HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.9) Gecko/2009050519 Firefox/2.0.0.13 (Debian-3.0.6-1)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1255,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: wikipp=1234; wikipp_username=??????
Cache-Control: max-age=0
Run Code Online (Sandbox Code Playgroud)
和apache,nginx和lighttpd HTTP_COOKIECGI变量的原始响应:
wikipp=1234; wikipp_username=??????
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我有以下场景:
class my_base { ... }
class my_derived : public my_base { ... };
template<typename X>
struct my_traits;
Run Code Online (Sandbox Code Playgroud)
我想专门my_traits用于从my_base包括派生的所有类,例如:
template<typename Y> // Y is derived form my_base.
struct my_traits { ... };
Run Code Online (Sandbox Code Playgroud)
我在添加标签、成员my_base以使其更简单方面没有问题。我已经看到了一些技巧,但我仍然感到迷茫。
如何以简单而简短的方式做到这一点?
有什么区别:_fullpath和GetFullPathName
当然,我的意思是分别比较他们的ANSI/Unicode变体
_fullpathvsGetFullPathNameA_wfullpathvsGetFullPathNameW看来_fullpath有更漂亮和更简单的API,因为它允许分配缓冲你,但我只是想,如果我更换GetFullPathNameW与_wfullpath我会错过?
我正在使用 Servlet 3.0 的javax.servlet.AsyncContext接口实现服务器发送的事件。
但是,我无法理解我应该如何处理对等断开连接等 I/O 错误。
对于给定的AsyncContext ac = request.startAsync(),我可以调用ac.getResponse().getWriter().print(something)然后ac.getResponse.getWriter().flush()它工作正常。但是,当客户端断开连接时,我不会收到错误消息——即使我附加了一个侦听器,onError也不会调用它的方法。
我用 Jetty 8 和 Tomcat 7 对它进行了测试,似乎与客户端的断开连接没有报告给应用程序。
如何检测通信错误?
我用 Keras/TF2.5 训练了一个简单的模型并将其保存为保存模型。
tf.saved_model.save(my_model,'/path/to/model')
Run Code Online (Sandbox Code Playgroud)
如果我通过检查它
saved_model_cli show --dir /path/to/model --tag_set serve --signature_def serving_default
Run Code Online (Sandbox Code Playgroud)
我得到这些输出/名称:
inputs['conv2d_input'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 32, 32, 1)
name: serving_default_conv2d_input:0
outputs['dense'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 2)
name: StatefulPartitionedCall:0
Run Code Online (Sandbox Code Playgroud)
名称serving_default_conv2d_input和StatefulPartitionedCall实际上可以用于推断。
我想使用 python API 提取它们。如果我通过加载模型来查询它:
>>> m=tf.saved_model.load('/path/to/model')
>>> m.signatures['serving_default'].inputs[0].name
'conv2d_input:0'
>>> m.signatures['serving_default'].outputs[0].name
'Identity:0'
Run Code Online (Sandbox Code Playgroud)
我得到完全不同的名字。
问题:
serving_default_conv2d_input提取这些名称?StatefulPartitionedCalltf.saved_model.save?:0意思?还有附带问题:
如何通过 SavedModel 将 TF 模型部署到生产环境?
我使用TCP Keep-Alive选项来检测死连接.它适用于使用读取套接字的连接:
setsockopt(mysock,...) // set various keep alive options
epoll_ctl(ep,mysock,{EPOLLIN|EPOLERR|EPOLLHUP},)
epoll_wait -> (exits after several seconds when remove host disconnects cable)
Run Code Online (Sandbox Code Playgroud)
Epoll等待在套接字上使用EPOLLIN | EPOLLHUP退出而没有问题.
但是,如果我尝试向socket写入很多东西,直到我得到EAGAIN然后轮询读取和写入,我在断开电缆时没有出错:
setsockopt(mysock,...) // set various keep alive options
while(send() != EAGAIN)
;
epoll_ctl(ep,mysock,{EPOLLIN|EPOLLOUT|EPOLERR|EPOLLHUP},)
epoll_wait -> --- Never exits!!!! even when the cable of the remove host is disconnected!!!
Run Code Online (Sandbox Code Playgroud)
编辑:附加信息
当我监控与wireshark的通信时,在第一种情况下(读取)我会在几秒钟内得到一次ack请求.但在第二种情况下,我根本检测不到.
c++ ×4
c ×2
winapi ×2
asynchronous ×1
boost-asio ×1
comet ×1
cookies ×1
epoll ×1
event-loop ×1
inference ×1
inheritance ×1
jakarta-ee ×1
jetty ×1
keep-alive ×1
linux ×1
memory-leaks ×1
mingw ×1
nonblocking ×1
porting ×1
posix ×1
python ×1
rfc ×1
servlet-3.0 ×1
tcp ×1
tensorflow ×1
tf.keras ×1
tomcat ×1
webserver ×1