Ваш делегат ожидает два параметра:
public delegate List<CustomObj> SearchFoo(string a, string b);
Строка A и строка B
d = foo;
private List<CustomObj> foo(string a, string b, string c)
{ ... }
Когда вы делаете это, у вас есть 3 параметра в foo, но ваш делегат ожидает только 2, поэтому вы получаете исключение.
Если те сокеты - все в состоянии TIME_WAIT, это нормально по крайней мере на некоторое время. Проверьте это с netstat; сокетам свойственно бродить вокруг в течение нескольких минут, чтобы гарантировать, что разбросанные данные из сокета успешно выброшены прежде, чем снова использовать порт для нового сокета.
Можно также хотеть проверить /proc/<pid>/fd
, каталог будет содержать все Ваши в настоящее время открываемые дескрипторы файлов. Если файл исчезает после закрытия сокета, Вы не столкнетесь ни с какими проблемами (по крайней мере, не с Вашими дескрипторами файлов :).
Возможно, это - сокет некоторого другого протокола ("Не может определить протокол" а?) используемый внутренне в реализации, чтобы сделать что-то, которое создается на первом сокете.
Вы неоднократно пытались создать сокеты и закрыть их, видеть, сохраняются ли эти сокеты действительно? Кажется вероятным, что это - одноразовое.
Java, вероятно, использует сокеты внутренне для большого количества вещей - они могли бы быть Unix, Netlink (в соответствии с Linux) или некоторый другой тип сокета.
Создайте маленький сценарий удара, чтобы контролировать открытые сокеты для определенного приложения или pid, и позволить ему работать при тестировании приложения Java.
Я сомневаюсь так или иначе, что существует любой вид утечек в этой вещи, поскольку сокеты очень используются в мире linux/unix, и этот вид проблемы пузырился бы очень quicky