socat TCP file server

I'm trying to set up a simple socat fileserver using TCP to send small files (~100KB).

Here are the one-line servers and client for one file:

Server: socat -u -d -d OPEN:file.dat TCP-LISTEN:<port>,reuseaddr,fork

Client: socat -u -d -d TCP:<server>:<port> OPEN:file.dat,creat

The first data transfer always works, but the following are not always working. Most of the following transfer create an empty file on the client-side. The problem persists with multiple clients transfering once, and I veryfied that data is not transfered when the bug occurs, but the log and return values doesn't indicate any errors, just a shorter data loop.

I tried pretty much every option mentionned here: http://www.dest-unreach.org/socat/doc/socat.html

The only way I found to make it work multiple consecutive times is to remove the fork option from the server listenner and to wrap the whole commande line in a bash loop, but of course it fails for multiple clients.

I tried with Ubuntu, Fedora, Redhat and FreeBSD.

Am I missing something or is this a bug ?


Solution 1:

I had the same problem and it took me hours to figure out what I was doing wrong. I still kind of don't but I know at least how to make it work. I was using:

socat -u FILE:/tmp/test.txt TCP-LISTEN:5778,reuseaddr,fork

And it worked as expected when I switched to:

socat TCP-LISTEN:5778,reuseaddr,fork FILE:/tmp/test.txt

I'm not sure what's actually changing but dropping the -u flag and swapping the order of the addresses will open up the socket for multiple client calls. I stumbled across it while trying to duplicate a known working example of a server.

Also my client was simply socat -u TCP:localhost:5778 STDOUT. It works without the -u as well.