1

I have a question that is very similar to this question, but the solution provided is not working for me. And actually I want to do something a little different, so maybe there's a better way.

My hope is to send UDP unicast packets (a video stream) to a server. The server will forward these packets to another computer. Optionally, someone logged into the server will be able to watch the video stream using something like mplayer. I'm pretty sure I could stream the video both to the server and to the final destination from the video source, but I really want the server to be in control of that.

First Attempt: Downloaded nmap to get the ncat tool. Thought I could use that to download and pipe bytes to mplayer and forward with another ncat process. I can pipe to mplayer and it works great, I just can't forward at the same time. If I was using Linux, apparently I could use tee and process substitution, but I'm looking for a Windows solution.

Second Attempt I found a solution that kind of implied piping to multiple programs would be possible in PowerShell. But what I found is that binary piping wasn't going to work.

Third Attempt I attempted to program a tee-like executable that would tee to two programs. This was about as close as I got, but the video streams seemed to get a bit corrupted. I think it was more of a performance issue than anything.

Fourth Attempt Now I'm at the point where I've discovered socat which led me to the question I linked to. It seems odd, but I thought a solution would be for my server to forward packets to the destination AND forward packets to a different port on the server which would be used with netcat or socat to pipe into mplayer. I'd rather not use up another port on the server, but if that's what I have to do, then ok. But like I said, the solution from the other question didn't seem to work. Mplayer started to buffer, then stopped very shortly.

Ran each of these in a separate cmd window in this order. Notice I wasn't trying to forward to the destination computer yet, just trying to get mplayer to work on the server.

socat UDP4-LISTEN:5000 UDP-DATAGRAM:224.10.10.10:5001

socat UDP4-RECVFROM:5001,ip-add-membership=224.10.10.10:0.0.0.0,reuseaddr,fork UDP-DATAGRAM:192.168.16.33:5002

ncat -l -u -p 5002 | mplayer -vo direct3d -cache 1024 -

I seem to get about 924 bytes received according to MPlayer output.

I'm fresh out of ideas, though I will continue learning about socat. I assume I am not running socat correctly, but I'm not really sure where the issue is. If anyone can point out my mistake or offer an alternative solution I'd really appreciate it. Thanks.

Edit:

I did some more testing and if I change the second socat to do this:

socat UDP4-RECVFROM:5001,ip-add-membership=224.10.10.10:0.0.0.0,reuseaddr,fork - | mplayer -vo direct3d -cache 1024 -

I find that it will play the stream from the multicast address. But apparently forwarding to the unicast address on port 5002 is what's not working.

Community
  • 1
  • 1
Dan
  • 533
  • 8
  • 29

1 Answers1

0

Ok, I'm not really sure why this is, but the netcat process that worked fine to receive the UDP packets from the sender and pipe to MPlayer does not work here. I'm not sure what the problem is.

So instead of:

ncat -l -u -p 5002 | mplayer -vo direct3d -cache 1024 -

I had to use:

socat UDP4-RECVFROM:5002,fork - | mplayer -vo direct3d -cache 1024 -

Though I do still have one small problem. If I close MPlayer, I get a ton of messages like:

2015/02/24 11:14:04 socat[5888] E write(1, 0x800432e8, 986): Broken pipe

Also if I hit Ctrl-C from the command line it takes a few tries and then when MPlayer stops, my keyboard no longer works and I have to start a new cmd window.

Dan
  • 533
  • 8
  • 29