这是在使用套接字的应用程序之间创建一些临时进程间通信的测试。这些应用程序稍后将使用定制的嵌入式通信系统在不同的系统上运行,但目前后者不可用。因此,我正在寻找一种快速 - 甚至可能稍微脏一点 - 的c ++方法来实现这些应用程序之间的进程间通信。应用程序将发送一些字符串(所以没什么太花哨的)。
我偶然发现oscpack利用udp
来实现消息传递以进行开放式声音控制。我使用make lib
在gcc4.7.1中使用gcc4.7.1将其编译为共享对象。请注意,我必须在-fPIC
的{{1}}变量中附加选项COPTS
。
有了共享库,我编写了一个小概念证明应用程序,它使用一个单独的线程来监听消息,并在主线程中等待来自Makefile
的一些字符串将其转发给另一个申请。我执行了2个非常类似的应用程序实例。只是在第二个实例中,我交换了stdin
和PORT_RCV
数字。
实际问题从这里开始:
我面临的问题是,在接收端,当对PORT_SND
(最终运行recvfrom())的调用解除阻塞时,我得到读取字节的返回值等于零(0)。此外,osc::UdpSocket::ReceiveFrom()
指针仍指向零。所以本质上我没有从发送者应用程序收到字符串,即使recvfrom()在正确的时间解锁。
从我阅读的手册页中,当发件人关闭连接时,recv和recvfrom可以返回值0。但在这种情况下发件人使用udp即无连接...连接:),所以我不确定它是否适用于此。
我尝试使用char * data
侦听相应端口中的udp消息,并验证至少发件人部分是否有效。确实有netcat
,我确实会收到我输入的消息。所以可能问题可能与接收端有关。
问题是:我正确使用了recvfrom吗?
请将代码附加到进程间通信测试应用程序(真正的全双工信使)。要执行其中的2个,首先下载并编译为netcat -u -l -p <sender port of the running instance>
库的库。然后将以下源复制到两个文件中,并交换第二个源文件中的oscpack
和PORT_RCV
数字。
然后使用:
编译每个PORT_SND
然后执行它们并输入一个单词,按回车键并期望(不)看到它显示在另一个应用程序中。
#compile
g++ -g -Wall -Wextra -pedantic -std=c++11 -I../oscpack -c -o "obj_dbg/messenger.opp" "src/messenger.cpp"
#link
g++ -g -Wall -Wextra -pedantic -std=c++11 -I../oscpack obj_dbg/messenger.opp -o "messenger_dbg" -L../oscpack -pthread -loscpack
答案 0 :(得分:1)
char * buffer = nullptr;
int bufferSize = 0U;
问题在这里。
int i = s.ReceiveFrom(ipenRcv,buffer,bufferSize);
你告诉ReceiveFrom()
接收到空指针指向的零长度缓冲区,所以它会这样做,并返回零。它还能做什么?改为:
char buffer[4096]; // or whatever you need
// ...
int i = s.ReceiveFrom(ipenRcv,buffer,sizeof buffer);