我读过对"如何计算多部分HTTP请求内容长度?"这一问题的冲突和有些含糊不清的回复.我特别想知道:
有人能提供一个明确的例子来回答这些问题吗?
在Ubuntu上使用'gcc'编译C++源文件时遇到了一个令人费解的问题.解决了这个问题后,我想在这里发布它,以免其他人解决问题.
为了这个报告,我们有最简单的C++"Hello,World"程序,存储在main.cpp中:
#include <stdio.h>
int main (int argc, char *argv[])
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行命令时:
gcc main.cpp
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
cc1plus: out of memory allocating 1677721600 bytes after a total of 475136 bytes
Run Code Online (Sandbox Code Playgroud)
我确认我正在编译正确的位数(即32位).我做错了什么?
这篇文章涉及最近一个软件项目中遇到的技术问题,并允许读者从问题的来之不易的解决方案中受益.
背景
在我的公司,我是内部库的实现者和维护者,它使用Boost asio("ASynchronous I/O")套接字框架来实现套接字上的跨平台数据传输.一位同事最近遇到了以下问题:如果Wi-Fi路由器在文件传输操作期间被毫不间断地关闭,她的Blackberry 10应用程序会链接并使用我的库,在几秒钟内崩溃.
在库中启用内置跟踪向我们展示了当库调用boost :: asio :: write(boost :: asio :: ip :: tcp :: socket*,boost :: asio :: buffer)时发生崩溃)函数与套接字不是'有效'(即套接字可能无法使用).在write()周围放置一个try/catch(boost :: system :: system_error)块无法捕获任何内容 - 崩溃显然发生在Boost中.
因为崩溃只发生在发布版本中,所以我们无法使用调试器.
技术信息
以下是编译器的典型命令行调用:
/home/foobar/bbndk/host_10_1_0_238/linux/x86/usr/bin/QCC
-Vgcc_ntoarmv7le
-lang-c++
-x c++
-DLINUX -DQNX -DSUPPORT_LAN -DUSE_SQLITE_FOR_DATABASE
-Wno-psabi -Wno-write-strings
-O3
-DNDEBUG
-fno-strict-aliasing
-fPIC
-I/home/foobar/Libraries/BlackBerry_10/boost_1.48/include
...
-I/home/foobar/Libraries/BlackBerry_10/utfcpp_1.0/include
-o CMakeFiles/Internals.dir/ConfigFileSingleton.cpp.o
-c /home/foobar/myproject_dev/myproject/SDK/Internals/ConfigFileSingleton.cpp
Run Code Online (Sandbox Code Playgroud)
用于查找问题源的步骤
我们编写了一个轻量级的最小应用程序,尝试用更少的代码重现问题,首先使用原始套接字,然后使用Boost的ASIO.如果崩溃发生,我们可以认为问题不是由我们的专有库引起的.不幸的是,崩溃是不可重复的,导致我们怀疑我们的库有错.
我们编写了一个轻量级跟踪框架,用于Boost的ASIO头文件,用于检测与问题相关的功能.框架在进入和退出这些函数时输出一个字符串,使我们也可以跟踪变量的值.
使用跟踪框架,我们能够证明发生了boost :: throw_exception崩溃()模板函数(非相关#ifdef'd代码中删除).当系统级写入操作在"损坏的管道"上失败时,Boost调用此函数:
template<class E> BOOST_ATTRIBUTE_NORETURN inline void throw_exception( E const & e )
{
//All …Run Code Online (Sandbox Code Playgroud) 根据最近的实证结果,并基于网络上的各种帖子,似乎在启用了个人热点的iPhone上运行的应用程序无法将广播和/或多播发送到个人热点的网络上.任何人都可以解释这个问题的原因吗?
应用程序
我有一个IOS应用程序,使用跨平台C++代码构建,可以在其运行的网络上广播和多播其存在.当iPhone连接到Wi-Fi网络时,该应用程序可以正常运行.在这种情况下,网络上的其他设备接收广播/多播,一切正常.通过将运行WireShark的计算机连接到网络,可以轻松验证这一点 - 可以在数据包跟踪中看到广播/多播数据包.
毋庸置疑,该应用程序在连接到本地Wi-Fi的iPhone上运行良好.
问题
当我在启用了个人热点的iPhone上运行应用程序时,不会在热点网络上发布广播/多播.这可以使用WireShark进行验证,WireShark在其跟踪中不显示此类数据包.
关于使用个人热点作为能够处理广播和多播的网络路由器有什么限制吗?
当我使用浏览器在我的"WireSharking"设备上请求网页时,个人热点会正确响应所有数据包,并返回Web内容.
抵押信息
我遇到过报告相同或类似问题的其他Stack Overflow帖子:
在iPhone上编写这样的广播/多播应用程序的一个很好的教程是Michael Tyson的" The Talk of Talkie:Multi-interface broadcast and multicast ".只需说我的应用程序符合所有要求(例如,在适当的位置设置套接字选项SO_BROADCAST,SO_DONTROUTE和IP_MULTICAST_IF).
对上述参考文献(1)的回复写道" 可能是因为个人热点引入了网络地址转换? ".我过滤了WireShark跟踪以仅显示连接到热点IP的数据包,并且没有证据表明个人热点将任何内容发送到NAT地址.
综上所述
任何人都可以解释为什么运行个人热点的iPhone不会广播/组播数据包,以及如何解决这个问题?
提前谢谢了.
我的 Java 应用程序有一个 JNI 层,用于与本机 C++ 库通信。当应用程序空闲大约三 (3) 分钟时,应用程序崩溃,LogCat 显示以下堆栈跟踪:
07-13 13:21:35.876: A/libc(9889): Fatal signal 11 (SIGSEGV) at 0x606b0ba4 (code=1), thread 9889 (nc.myapp)
07-13 13:21:35.980: I/DEBUG(4710): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-13 13:21:35.980: I/DEBUG(4710): Build fingerprint: 'motorola/ghost_retail/ghost:4.4.3/KXA21.12-L1.21/23:user/release-keys'
07-13 13:21:35.981: I/DEBUG(4710): Revision: 'p300'
07-13 13:21:35.983: I/DEBUG(4710): pid: 9889, tid: 9889, name: nc.myapp >>> com.company.myapp <<<
07-13 13:21:35.984: I/DEBUG(4710): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 606b0ba4
07-13 13:21:36.093: I/DEBUG(4710): …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序通过REST API与我的Amazon S3存储桶通信.身份验证工作正常,我能够执行许多操作(例如,创建文件夹,上传文件,下载文件,GET对象).
我还有一个问题:虽然我的REST请求删除文件夹成功(即AWS返回"204 No Content"响应),仍然可以通过AWS Web控制台访问"已删除"文件夹.
在发出DELETE请求之前,我可以通过AWS Web控制台看到该文件夹(及其子文件夹和文件)存在.我的存储桶版本已禁用.
现在,应用程序发出REST DELETE请求:
DELETE /App_Root/ HTTP/1.1
Accept: */*
User-Agent: libcurl/7.28.0 OpenSSL/0.9.8j App/2.1.105-Windows
Host: my-company-s3-account.s3.amazonaws.com
Date: Sat, 20 Feb 2016 18:24:08 +0000
Authorization: AWS [signed string]
Run Code Online (Sandbox Code Playgroud)
以下是从Amazon S3收到的回复:
HTTP/1.1 204 No Content
x-amz-id-2: 6in0UAKZZWfgw2ifNhLVT8+UhNLGAo/8948L2SUqhg/OB5agr6X8q8ceQ/3Z4emO4n/XgfXqIUo=
x-amz-request-id: 42802B620F593699
Date: Sat, 20 Feb 2016 18:23:44 GMT
Server: AmazonS3
Run Code Online (Sandbox Code Playgroud)
刷新AWS Web控制台显示已删除的文件夹仍然存在.向Amazon S3发出另一个GET对象请求显示文件夹和文件仍然像以前一样存在.
我错过了什么吗?
我已将用 C++ 和 Boost 编写的长期稳定库移植到 Blackberry 10。该库在设备之间传输文件。该库编译和链接良好,并且运行良好。但是,在传输 1、2 或 3 个文件后,我始终在我的 Blackberry 10 设备上遇到抛出异常。在源代码中将异常作为 boost::system::system_error 捕获显示它是异常 16,文本为“mutex: Resource busy”。
这是发生异常的源代码:
try
{
. . .
// Find DtpFunctionData for the operation ID, use it to invoke handling function
std::map<int, FunctionData>::iterator iter = _vecFunctionData.find (operationId);
if (iter == _vecDtpClientFunctionData.end ())
return EC_GENERAL_FAILURE;
HANDLINGFUNC_1 handlingFunc = (*iter).second._clientHandlingFunc;
POSTOPFUNC_1 postOpFunc = (*iter).second._clientPostOpFunc;
bool callPostOpOnSuccess = (*iter).second._callPostOpOnSuccess;
// Open a socket opposite the remote peer's TcpPortListener
/* Start: ----- EXCEPTION 16: "mutex: Resource busy" …Run Code Online (Sandbox Code Playgroud) 我有一个基于Linux的应用程序,在Ubuntu 12.04 LTS下运行,编译,链接和运行没有问题.
我最近将我的Ubuntu升级到14.04 LTS,并且遇到了编译和链接应用程序的问题.
通过在两个文件中手动修改Boost 1.48的本地副本来解决编译问题(包括/ boost/config/stdlib/libstdcpp3.h pp和include/boost/thread/xtime.hpp).此时应用程序编译成功.
我遇到的问题是链接失败并显示错误消息:
c++: error: unrecognized command line option ‘-Wl’
Run Code Online (Sandbox Code Playgroud)
我使用CMake在多个平台上编译应用程序.这是CMake生成的链接描述文件.请注意,/ usr/bin/c ++现在无法识别"-Wl"选项:
/usr/bin/c++
-fno-stack-protector
-g
-Wl
CMakeFiles/Project.dir/main.cpp.o
CMakeFiles/Project.dir/TestCallback.cpp.o
CMakeFiles/Project.dir/utils.cpp.o
CMakeFiles/Project.dir/Request1.cpp.o
CMakeFiles/Project.dir/Response1.cpp.o
CMakeFiles/Project.dir/TextChatRequest.cpp.o
CMakeFiles/Project.dir/TextChatResponse.cpp.o
-o
/home/user/private/Project/Project_Release_1_2_Codename/Build/bin/Debug/Project
-L/home/user/Libraries/Ubuntu32_12.04/boost_1.48/lib
-L/home/user/Libraries/Ubuntu32_12.04/SqlLite_3.6/lib
-L/home/user/Libraries/Ubuntu32_12.04/taglib_1.7/lib
-L/home/user/Libraries/Ubuntu32_12.04/JSON_1.0/lib/Debug
-L/home/user/private/Project/Project_Release_1_2_Codename/Build/../lib/libUbuntu32/Debug
-rdynamic
/home/user/private/Project/Project_Release_1_2_Codename/lib/libUbuntu32/Debug/libAPI.a
/home/user/private/Project/Project_Release_1_2_Codename/lib/libUbuntu32/Debug/libInternals.a
-lboost_thread
-lboost_system
-lboost_filesystem
-lboost_program_options
-ltaglib
-lJSON
-lpthread
-Wl,-Bstatic
-lsqlite3
-Wl,-Bdynamic
-ldl
-Wl,-rpath,/home/user/Libraries/Ubuntu32_12.04/boost_1.48/lib:/home/user/Libraries/Ubuntu32_12.04/SqlLite_3.6/lib:/home/user/Libraries/Ubuntu32_12.04/taglib_1.7/lib:/home/user/Libraries/Ubuntu32_12.04/JSON_1.0/lib/Debug:/home/user/private/Project/Project_Release_1_2_Codename/Build/../lib/libUbuntu32/Debug
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的软件的版本信息:
Ubuntu:
14.04.1 LTS (trusty)
c++ compiler/linker:
(Ubuntu 4.8.2-19ubuntu1) 4.8.2
CMake:
Version 2.8.12.2
Run Code Online (Sandbox Code Playgroud)
为什么链接器不能识别"-Wl"命令?我升级到14.04 LTS是否修改了链接器软件库?如何备份和链接我的应用程序?