Sockets 在ubuntu上使用octave的套接字包

Sockets 在ubuntu上使用octave的套接字包,sockets,ubuntu,server,client,octave,Sockets,Ubuntu,Server,Client,Octave,我试图在我的Ubuntu上使用Octave的套接字包。我正在使用JavaSocketsAPI连接到Octave。Java程序是客户端,Octave是我的服务器。我刚刚尝试了您的代码示例: 有两个问题: 1.) 使用SOCK_流,出于某种奇怪的原因,recv()在accept()之后立即接收某些字节,即使我没有从客户端发送任何内容。我用Java发送的后续消息没有任何效果,似乎Octave套接字完全有自己的想法,它认为自己接收到了什么,而不管我实际发送的是什么 (二) 使用SOCK_DGRAM时,

我试图在我的Ubuntu上使用Octave的套接字包。我正在使用JavaSocketsAPI连接到Octave。Java程序是客户端,Octave是我的服务器。我刚刚尝试了您的代码示例:

有两个问题:

1.)

使用SOCK_流,出于某种奇怪的原因,recv()在accept()之后立即接收某些字节,即使我没有从客户端发送任何内容。我用Java发送的后续消息没有任何效果,似乎Octave套接字完全有自己的想法,它认为自己接收到了什么,而不管我实际发送的是什么

(二)

使用SOCK_DGRAM时,还有另一个问题: 我确实通过这种方式收到了实际的消息,但recv()命令似乎没有从数据报队列中删除第一个元素。在我将第二个数据报发送到套接字之前,任何后续的recv()命令都将重复读取第一个数据报,就像它仍然在队列中一样。因此recv()函数甚至不会阻塞以等待实际新的可用数据报。相反,它只是再次读取相同的旧版本。这是无用的,因为我不能告诉我的服务器等待来自客户端的消息

UDP的行为应该是这样的吗?我认为数据报数据包实际上是由recv()从数据报队列中删除的

这是我的服务器端代码:

s=socket(AF_INET, SOCK_DGRAM, 0);
bind(s,12345);
[config,count] = recv(s, 10)
[test,count] = recv(s, 4)
这是我的Java客户端:

public LiveSeparationClient(String host, int port, byte channels, byte sampleSize, int sampleRate, int millisecondsPerFrame) throws UnknownHostException, IOException {
this.port = port;
socket = new DatagramSocket();
this.host = InetAddress.getByName(host);
DatagramPacket packet = new DatagramPacket(ByteBuffer.allocate(10)
.put(new byte[]{channels, sampleSize})
.putInt(sampleRate)
.putInt(millisecondsPerFrame)
.array(), 10, this.host, port
);
socket.send(packet);
samplesPerFrame = (int) Math.floor((double)millisecondsPerFrame / 1000.0 * (double)sampleRate);
}
如您所见,我用recv(s,10)发送10个字节并接收全部10个字节(到目前为止,这是有效的)。在我的Java程序的后面部分,数据包将被生成并发送,但这可能需要几秒钟。同时,第二个接收信号recv(s,4)在倍频程中应该等待一个真正新的数据报包。但这不会发生,只是再次读取相同旧包的前4个字节。recv()不会第二次阻止

我希望你能解决这个问题

提前感谢:-)

马文

另外,我不明白为什么在使用SOCK_流时listen()和accept()都是必需的,但对于SOCK_DGRAM却不是