# socket-takeover **Repository Path**: mirrors_acassen/socket-takeover ## Basic Information - **Project Name**: socket-takeover - **Description**: Socket takeover from one process to another - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-08-08 - **Last Updated**: 2025-11-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Socket Takeover: Socket takeover from one process to another ============================================================ When you are running business mission critical services you MUST rely on design offering zero downtime. It is truly the case when considering upgrading/updating such mission critical software components. This software introduce a design pattern to perform seamless TCP socket takeover from one process to another. The code here is just a proof of concept and can be used for experimentation or integration into more complex software component. This source code is using design present in 4.4BSD systems. Using SCM_RIGHTS ancillary data over a Unix domain socket to transport a set of file descriptors. You can find more informations on this technic by reading good litterature from [W. Richard Stevens: UNIX Network Programming Volume 1 Third Edition], section 15.7. The code proposed here will make it more Linux specific by introducting a mechanism to takeover and synchronize client/server interactions. # Content 2 directories are available : * server : TCP server code * client : TCP client code # Give it a try : Server side $ cd server $ make $ ./server -h Usage: ./server [OPTION...] -a, --listen-address Address to bind TCP listener on -p, --listen-port Port to bind TCP listener on -b, --listen-backlog TCP listener backlog -t, --takeover-path Takeover channel unix domain path -T, --takeover Perform takeover operation -h, --help Display this help message $ ./server -a 127.0.0.1 -p 1234 -t /tmp/.takeover # Give it a try : Client side $ cd client $ make $ ./client -h Usage: ./client [OPTION...] -a, --connect-address Connection Address -p, --connect-port Connection Port -h, --help Display this help message $ ./client -a 127.0.0.1 -p 1234 # Having fun [client]$ ./client -a 127.0.0.1 -p 1234 [server/sh1]$ ./server -a 127.0.0.1 -p 1234 -t /tmp/.takeover Starting TCP server on [127.0.0.1]:1234 (fd:3) Starting Takeover channel on [/tmp/.takeover] domain socket Accepting connection from Peer [127.0.0.1]:57796 (fd:4) Starting connection with Peer [127.0.0.1]:57796 (fd:4) [127.0.0.1]:57796 - seqnum:0 [127.0.0.1]:57796 - seqnum:1 [127.0.0.1]:57796 - seqnum:2 [127.0.0.1]:57796 - seqnum:3 [127.0.0.1]:57796 - seqnum:4 [127.0.0.1]:57796 - seqnum:5 [127.0.0.1]:57796 - seqnum:6 [127.0.0.1]:57796 - seqnum:7 [127.0.0.1]:57796 - seqnum:8 [127.0.0.1]:57796 - seqnum:9 [127.0.0.1]:57796 - seqnum:10 [127.0.0.1]:57796 - seqnum:11 [127.0.0.1]:57796 - seqnum:12 [127.0.0.1]:57796 - seqnum:13 [127.0.0.1]:57796 - seqnum:14 [127.0.0.1]:57796 - seqnum:15 [127.0.0.1]:57796 - seqnum:16 [127.0.0.1]:57796 - seqnum:17 [127.0.0.1]:57796 - seqnum:18 [127.0.0.1]:57796 - seqnum:19 Accepting connection from Takeover channel Current fd_array:={[3][4]} [127.0.0.1]:57796 - seqnum:20 Holding connection with Peer [127.0.0.1]:57796 (fd:4) Releasing Peer [127.0.0.1]:57796 (fd:4) tcp_peer_release(): Tcp peers released... [server/sh2]$ ./server -T /tmp/.takeover Starting connection with Peer [127.0.0.1]:57796 (fd:5) Starting Takeover channel on [/tmp/.takeover] domain socket [127.0.0.1]:57796 - seqnum:21 [127.0.0.1]:57796 - seqnum:22 [127.0.0.1]:57796 - seqnum:23 [127.0.0.1]:57796 - seqnum:24 [127.0.0.1]:57796 - seqnum:25 [127.0.0.1]:57796 - seqnum:26 [127.0.0.1]:57796 - seqnum:27 [127.0.0.1]:57796 - seqnum:28 [127.0.0.1]:57796 - seqnum:29 ... Enjoy, Alexandre