Articles of c + +

getsockopt(…,SO_ORIGINAL_DST,…)偶尔会返回客户端地址

我正在接受HTTP请求并将它们转发到目标上的项目。 我们使用Linux(2.6.35.14-106.fc14.x86_64)和TPROXY。 我会在下面的细节。 我看到的问题是,偶尔(1000次中的1次,有时是100万次中的1次),Linux将返回对等地址作为目标地址。 有没有人见过这种情况? 我从2007年起在网上看到一个音符,所以我认为这可能有点过时了。 我有以下代码(请原谅这里显示的不一致的方法): struct sockaddr clientaddr; socklen_t clientlen = sizeof(clientaddr); int status = getpeername(acceptedSocket, &clientaddr, &clientlen); char clientName[256]; clientName[0] = '\0'; int clientport = 0; if (status == 0) { inet_ntop(AF_INET, (void *) &((struct sockaddr_in *)&clientaddr)->sin_addr, clientName, 256); clientport = ntohs(((struct sockaddr_in *)& clientaddr)->sin_port); **printf("Socket::acceptConnection: getpeername : %s:%d\n", clientName, clientport); fflush(stdout);** […]

如何使用TOS设置消息优先级?

IP标头具有服务types(TOS)字段。 它可以用来设置有类别的排队规则,即PRIO。 我testing了以下代码。 #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <unistd.h> int main(int argc, char**argv) { int listenfd, connfd, optval; struct sockaddr_in servaddr, cliaddr; socklen_t clilen; pid_t childpid; char mesg[16]; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); bzero(mesg, 0, sizeof(mesg)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port = htons(32000); bind(listenfd,(struct sockaddr *)&servaddr, sizeof(servaddr)); listen(listenfd, 1024); for (;;) […]

OpenCL的。 奇怪的数组寻址/指针错误

我有这个简单的内核进行testing。 __kernel void nfa(__global const int *a, __global int *output) { output[0] = a[0]; } 注意:这是在CPU上运行,内存可能在主机上。 它导致这个错误。 * glibc检测到 ./program:malloc():smallbin双链表损坏:0x0000000000a4a540 * * 我怀疑这是破坏程序的一部分,因为它正在访问主机内存。 但据我所知,所有内存分配正确。 它在堆栈上,但在运行时停留在范围内。 但是,如果我这样做: __kernel void nfa(__global const int *a, __global int *output) { a = a; output[0] = a[0]; } 这导致答案2,这是正确的,因为a是一个数组[2,4,8]; 对自己的分配解决了这个问题… 这也很好,导致4。 __kernel void nfa(__global const int *a, __global int *output) […]

棘手的未定义的参考错误

在使用C ++在Linux中构build模块时遇到了一个棘手的“未定义引用”错误。 我将在高层描述它,并在必要时发布代码(这是专有的,所以发布它需要更改一些名称)。 一些细节: 模块A(一个库)有一个类,我们将称之为Bar的方法称为Foo。 模块A构build得很好,使用nm来查看目标文件显示构造函数和Bar都被定义(它们显示为“T”)。 模块B(一个库)包含一个使用模块A的类,引用了Foo :: Foo,Foo ::〜Foo和Foo :: Bar。 它的makefile包括-L / path / to / Foo和-lFoo。 这个模块也构build得很好。 但是,当我在模块B的目标文件上运行nm时,对模块Foo :: Foo,Foo ::〜Foo和Foo :: Bar的调用未定义(它们显示为“U”)。 为什么它构build超越了我。 模块C–其输出是一个可执行文件 – 包含对模块B的引用。当我尝试构build模块C时,它向我叫喊从模块B到模块A的Foo和Bar方法的未定义引用。 为什么模块B构build如果引用是不确定的? 为什么错误只有在我们进入模块C时才报告? 编辑: 我应该提到模块C的makefile也有-L / path / to / Foo和-lFoo,但仍然失败。 任何我应该尝试的任何高级猜测? 我有一种感觉,我将不得不张贴一些代码…

我应该使用什么作为gtkmm的opengl小部件?

我想在一个gtkmm应用程序中使用opengl。 我发现了一些小部件,比如gtkglextmm,但是gtkmm 2.4和我使用gtkmm 3.0。 cluttermm不在Ubuntu的仓库,我不知道这是我在找什么。

RapidXML奇怪的parsing

我有一个非常恼人的问题,我试图解决它很多小时。 我正在使用C ++的rapidXML来parsingXML文件: xml_document<> xmlin; stringstream input; //initialized somewhere else xmlin.clear(); xmlin.parse<0>(&(input.str()[0])); cout << "input:" << input.str() << endl << endl; xml_node<char> *firstnode = xmlin.first_node(); string s_type = firstnode->first_attribute("type")->value(); cout << "type: " << s_type << endl; 不过,我在标准输出上得到了这个结果: input:<?xml version="1.0" encoding="utf-8"?><testxml command="testfunction" type="exclusive" /> type: exclusive" /> 这可能是什么原因(打印s_typevariables)? 这是非常烦人的,因为我不能很好地处理XML。

在linux下用C ++编写的IPC

我一直试图用FIFO来实现IPC,我已经在下面做了,似乎工作正常,testing了几次,对我来说看起来不错。 问题是我需要照顾什么,我知道读写将是primefaces的,因为我将写在PIPE_BUF之下。 我已经这样运行了 。/作家 ./reader ./reader 我看到读者工作正常,例如第一个阅读器读取1,然后第二个阅读器读取2和3,然后第一个阅读器读取4,等等。 请注意,我已经在这里find了代码,我修改了它。 writer.c #include<stdio.h> #include<unistd.h> #include<fcntl.h> #include<sys/types.h> #include<sys/stat.h> #include<string.h> int main() { int fd,fd1; fd=open("fifo1",O_WRONLY); int data = 1; while (1){ write(fd,&data,sizeof(int)); usleep(10); data++; } //printf("File Content :%s",s1); } reader.c #include<stdio.h> #include<unistd.h> #include<fcntl.h> #include<sys/types.h> #include<sys/stat.h> #include<string.h> int main() { int fd,fname; mkfifo("fifo1",0600); fd=open("fifo1",O_RDONLY); int d = 0; while(read(fd,&d,sizeof(int))!=0) { […]

将命令行的输出逐行读入c ++中的string向量中

我需要读一个bash命令的输出到string的行,逐行。我试着用ifstream这个代码,但它给错误。 我必须用什么来parsing它们而不是ifstream? using namespace std; int main() { vector<string> text_file; string cmd = "ls"; FILE* stream=popen(cmd.c_str(), "r"); ifstream ifs( stream ); string temp; while(getline(ifs, temp)) text_file.push_back(temp); for (int i=0; i<text_file.size(); i++) cout<<text_file[i]<<endl; }

套接字的function

我正在写Linux守护进程,我想实现通过telnetconfiguration其参数的能力。 我有一个cli接口代码,使用历史和完成者使用gnu readline库编写,我想使用该接口代码守护进程。 我试图将stdin / stdoutredirect到套接字,将rl_instream / rl_outstreamredirect到套接字,读/写到master / slave pty,但没有成功。 类似的问题在这里没有任何答案。 也读过这个问题 ,但我没有孩子的过程。 我的问题是: 我如何在单个进程中使用ptyfunction? 如果我只有一个进程,是否需要使用master和slave pty? 代码示例(没有对pty设备进行操作),预期结果 – readline正常工作 char* readline_buff; int main(void){ int mSock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP); int socketfd, n, flag = 1; int addrlen; daemon(1,1); setsockopt(mSock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int)); struct sockaddr_in addr; bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = […]

dynamicreplace正在播放的gstreamerpipe道中的元素

我正在寻找正确的技术,如果有的话,dynamicreplace正在运行的gstreamerpipe道中的元素。 我有一个基于gstreamer的c + +应用程序,它创build的pipe道看起来像这样(使用gst-launch语法): souphttpsrc location =“http://localhost/local.ts”! mpegtsdemux name = d! 排队! mpeg2dec! xvimagesink d。 ! 排队! a52dec! pulsesink 在播放过程中(即GST_STATE_PLAYING是pipe道状态,用户正在欣赏video),我需要从pipe道中删除souphttpsrc,并创build一个新的souphttpsrc,甚至是一个新的霓虹灯源,然后立即将其添加回pipe道并在我们执行此操作之前的同一时间位置处继续播放相同的uri源码stream。 用户可能会看到一个小延迟,这很好。 我们几乎不知道如何删除和replace源代码,我们需要更多的理解。 这是我们迄今为止最好的尝试: gst_element_unlink(source, demuxer); gst_element_set_state(source, GST_STATE_NULL); gst_bin_remove(GST_BIN(pipeline), source); source = gst_element_factory_make("souphttpsrc", "src"); g_object_set(G_OBJECT(source), "location", url, NULL); gst_bin_add(GST_BIN(pipeline), source); gst_element_link(source, demuxer); gst_element_sync_state_with_parent(source); 这并不完美,因为源从头开始播放,其余的pipe道正在等待正确的时间戳缓冲区(我假设),因为几秒钟后,播放select备份。 我试图以多种方式寻找来源,但没有任何工作。 我需要知道正确的方法来做到这一点。 如果我们想要dynamic地replace解码器或其他元件,那么知道一种通用技术(如果存在的话)也是很好的。 谢谢