I have a script that opens six tcp client sockets all of which then sit
there waiting to receive a trigger that tells them to send data. It’s
time critical so sending consecutively makes having six sockets
pointless as it’s first come first served.
Is it possible to send data to all six sockets at exactly
the same time?
This is essentially how my code works at the moment.
6.times do |i| @connection[i] = TCPSocket.new(server, port)
end
Thread.new(data) do
if data = true @connection.map { |i|
i.send_data
end
end
I have a script that opens six tcp client sockets all of which then sit
there waiting to receive a trigger that tells them to send data. It’s
time critical so sending consecutively makes having six sockets
pointless as it’s first come first served.
Is it possible to send data to all six sockets at exactly
the same time?
writing data to socket mean a transfer between your process memory
to TCP buffer ( usually 64 KB ). So if buffers are free, you can send
in a loop.
TCP was build in idea of file transfer, it is not the good media
for realtime stream.
for more efficient in timing precision, you can use:
UDP datagramme
UDP Multicast : you send one datagram, and then
switchs/router will duplicate it
writing data to socket mean a transfer between your process memory
to TCP buffer ( usually 64 KB ). So if buffers are free, you can send
in a loop.
TCP was build in idea of file transfer, it is not the good media
for realtime stream.
for more efficient in timing precision, you can use:
UDP datagramme
UDP Multicast : you send one datagram, and then
switchs/router will duplicate it
raw socket
libpcap
Thanks for the answer but I think you misunderstand my question. I have
an array of six sockets open in six threads and I can send the data to
each but the problem is they’re sent asynchronously.
The data is actually an XML request and I’ve already sent all but the
last “>” character and when a condition becomes true, I send that
character to each of the six sockets I have open and primed.
So it’s essentially doing the following loop …
Send “>” via socket 1
end
Send “>” via socket 2
end
Send “>” via socket 3
end
Send “>” via socket 4
end
Send “>” via socket 5
end
Send “>” via socket 6
end
That works but the time taken to send the data via socket 1 in 200ms
whilst by the time the data has been sent via socket 6 the time elapsed
is nearly 1 second.
I need the data to all six sockets in 200ms i.e. synchronously rather
than asynchronously.
That works but the time taken to send the data via socket 1 in 200ms
whilst by the time the data has been sent via socket 6 the time elapsed
is nearly 1 second.
I need the data to all six sockets in 200ms i.e. synchronously rather
than asynchronously.
1 seconds !!! it is really too much
What is your environment ? ESP8266 with wifi ?
in attachment, a little test (with minitcp, i am lazy…)
I got 8 ms for emissions of the last byte.
You should read/write on socket with send/recv, not print/puts.
If i replace socket.send(data,0) by socket.print(data) , i got issues
I think that puts/print use internal buffer, which may trouble your
process.
( You can also use soclet.flush(), which flush the internal buffer to io
port )