I've made a similar application and I finally decided to go with the second approach, it's much easier to design and maintain in terms of broken connections and the like. Also with this method you don't need to maintain 100 open sockets on the server. Every time a client connects you start a new thread to attend it, once the data is received and dispatched the thread terminates.
This is what I did:
Server will listen on a port (i.e. 5051) for clients to register. We required a random encrypted password that is generated base on the date and hour they connect this, of course, is optional and depends on your security needs.
Clients will listen on a port (i.e. 5052) for jobs to be processed. They only accept jobs from the same server (IP address) they have registered (again this is optional)
Server will listen on a port (i.e. 5053) for clients to communicate results. It only accepts results from registered clients.
And that’s it. The server maintains a list of registered clients; the list of clients will have the client's attributes: IP address, port number they are listening (if it's not fixed), kind of jobs they are able to perform (in case you need it), etc.