сокет надо закрывать двойным вызовом close
Однократный вызов переводи открытый сокет в листен мод, а второй его закроет...
When a socket type is TCP_TYPE_SERVER or TCP_TYPE_CLIENT_SERVER, the socket does not close after calling tcp_close. The active connection is closed, and the socket transits to TCP_STATE_LISTEN. In this state, the socket is still able to accept incoming connections. To close the TCP_TYPE_SERVER socket, the function tcp_close needs to be called twice.
еще из коментов к коду у вас
Код
tcp_get_socket (TCP_TYPE_SERVER | TCP_TYPE_DELAY_ACK | TCP_TYPE_FLOW_CTRL | TCP_TYPE_KEEP_ALIVE, 0, 65535, tcp_callback);
вот эти 65535 - это время между проверками что соединение живо TCP_TYPE_KEEP_ALIVE и вы не поверите, но оно в секундах,
то есть как у вас сокет будет проверять себя на жизнеспособность примерно 1 раз в 18 часов, то есть фактически никогда. Так что этот флаг вам мало поможет

. Если его убрать то это время авто закрытия сокета по бездействию, тогда чем больше тем оно конечно лучше...
Цитата
IP адрес для клиента закрываемого соединения где брать?
я так понимаю сохранять при открытии соединения... А зачем оно вам надо?